Синтаксическая ошибка Perl: пустое слово найдено там, где ожидался оператор

Это мой код Perl-скрипта. в этом я получаю сообщение об ошибке, например, «голое слово найдено там, где оператор ожидался в $ cmd»

my $path = $folder."/".$host."_".$database_name.".bak";
$cmd .= "-U $user_name -P $password -S $host -d master -Q "BACKUP DATABASE [$database_name] TO DISK = N'$path'" ";

кто-нибудь мне поможет?


person Stefan Edwards    schedule 22.10.2012    source источник


Ответы (2)


Когда в строке есть двойные кавычки, вам нужно экранировать их с помощью \.

$cmd .= "-U $user_name -P $password -S $host -d master -Q \"BACKUP DATABASE [$database_name] TO DISK = N'$path'\" ";

Кроме того, Perl позволяет использовать другие символы в качестве разделителей кавычек. qq, за которым следует почти любой символ, — это то же самое, что и двойные кавычки. Таким образом, вы можете делать такие вещи, чтобы избежать обратной косой черты:

$cmd .= qq(-U $user_name -P $password -S $host -d master -Q "BACKUP DATABASE [$database_name] TO DISK = N'$path'" );

$cmd .= qq|-U $user_name -P $password -S $host -d master -Q "BACKUP DATABASE [$database_name] TO DISK = N'$path'" |;

И так далее...

Обновление: как выполнить системную команду в Perl. Есть три основных способа:

system($cmd);  #Goes through the shell if shell metacharacters are detected.
system(@command_and_args);  #first element is the command, the rest are arguments

system выполняет команду и ожидает ее возврата. Возвращаемое значение — это статус выхода из программы.

my @results = `$cmd`;  #Always goes through shell.

обратные кавычки выполняют команду и возвращают результат. Вы должны использовать это только в том случае, если вам действительно нужен вывод; в противном случае лучше пойти с system.

exec $cmd;
exec @command_and_args;

exec точно такой же, как system, за исключением того, что он никогда не возвращается. Он эффективно завершает вашу программу, вызывая другую программу.

Используйте тот, который наиболее подходит для вашей ситуации. Или в этом случае, поскольку вы выполняете SQL, рассмотрите возможность использования модуля DBI. Это определенно лучший подход для чего-то большего, чем пара простых команд.

person dan1111    schedule 22.10.2012
comment
У меня есть еще одно сомнение. Какая команда используется для запуска этого sql-запроса из сценария perl - person Stefan Edwards; 22.10.2012
comment
@StefanEdwards, я обновил ответ информацией о запущенных системных командах. Если у вас возникли проблемы, первое, на что следует обратить внимание, исходя из моего опыта, — это цитирование. Это может быть привередливо, особенно если вы работаете в Windows. Я знаю, что какой-то другой вопрос о SO касался этого. - person dan1111; 22.10.2012

Похоже, вы поставили свои " символы не в том месте. Я не уверен, где они должны быть.

Во второй строке строковый литерал:

"-U $user_name -P $password -S $host -d master -Q "

сразу следует пустое слово

BACKUP
person Keith Thompson    schedule 22.10.2012
comment
Я изменил код следующим образом: $cmd .= -U $user_name -P $password -S $host -d master -Q .BACKUP DATABASE [$database_name] TO DISK = N'$path' ; - person Stefan Edwards; 22.10.2012
comment
@StefanEdwards: Сомнительно. Я скопировал и вставил строку кода из вашего комментария, и она компилируется без ошибок. - person Keith Thompson; 22.10.2012