Когда в строке есть двойные кавычки, вам нужно экранировать их с помощью \.
$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