Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Stefan EdwardsОтветов: 2

Это мой код 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'" ";

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

configsql-server-2008perl

Ответы

Ответ 1 · рейтинг 4 · dan1111

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

$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. Это определенно лучший подход для чего-то большего, чем пара простых команд.

Ответ 2 · рейтинг 1 · Keith Thompson

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

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

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

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

BACKUP

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы