2013-06-14 6 views
0

Im пытается запустить набор команд в командной строке системы с помощью perl.Что не так в этом perl-коде?

Вот код

#!/usr/local/bin/perl -w 

use strict; 

print_prompt(); 


sub print_prompt { 
print "What's your name?"; 
    system("G:\"); 
system("cd Documents and Settings/Administrator/eworkspace/Sample"); 
    print `ant`; 

} 

Но это бросает мне следующие ошибки

Bareword found where operator expected at execute.pl line 11, near "system("cd" 
(Might be a runaway multi-line "" string starting on line 10) 
String found where operator expected at execute.pl line 11, at end of line 
    (Missing semicolon on previous line?) 
syntax error at execute.pl line 11, near "system("cd Documents " 
Can't find string terminator '"' anywhere before EOF at execute.pl line 11. 

как устранить эту проблему? Что, возможно, не так в этом коде? Нужно ли указывать пробелы?

+5

Да ладно. Просто посмотрите на сообщение об ошибке: Вероятно, существует «бегущая многострочная» строка «-string, начинающаяся с строки 10». Посмотрите на строку в строке 10. Подумайте, почему она может охватывать несколько строк. Даже подсветка синтаксиса вашего сообщения говорит вам! – amon

+0

вы должны указать [escape character] (http://perldoc.perl.org/perlrebackslash.html). – Ganesh

ответ

6

Эти две линии:

system("G:\"); 
system("cd Documents and Settings/Administrator/eworkspace/Sample"); 

ломают несколькими способами. Во-первых, верхняя часть разбита так, как описывали передо мной другие люди. \ избегает ", так что он не закрывает строку с кавычками, и синтаксис остальной части вашего файла становится сломанным.

Но, во-вторых, обе эти линии сломаны более глубоко. Они не делают то, что вы думаете. На самом деле они оба, фактически, ничего не делают. Команда system вызывает новую среду оболочки, в которой выполняется команда. Новая среда наследует значения из родительской среды (той, которая запускает ваш код). Эти значения включают текущий каталог. Затем вы меняете текущий каталог в новой дочерней среде. Но когда команда system заканчивается (что происходит сразу), ваша новая среда уничтожается. Ваша программа продолжает работать в исходной среде с исходным текущим каталогом.

Возможно, вам стоит взглянуть на встроенную функцию Perl chdir.

1

Проблема здесь:

system("G:\"); 
  1. Это не разумная команда.
  2. обратной косой убегает в ", так что строка на самом деле

    "G:\"); 
    system(" 
    

    или qq{G:");\nsystem(} с альтернативным разделителем.

    После того, как строка должна прийти в какой-то форме оператора, но cd не один.

Решение: никогда не используйте обратную косую черту как разделители пути, они только вызывают проблемы. И удалить странную команду G:\, что она даже должна делать?

Чтобы включить буквальную обратную косую черту в строку, вам необходимо ее избежать: \\.

Смежные вопросы