Perl语法错误:找到运算符预期的裸字

时间:2012-10-22 07:17:21

标签: perl sql-server-2008 config

这是我的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'" ";

任何人帮助我?

2 个答案:

答案 0 :(得分:4)

当字符串中包含双引号时,您需要使用\转义它们。

$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.

Backticks执行命令并返回其输出。如果你真的需要输出,你应该只使用它;否则,最好使用system

exec $cmd;
exec @command_and_args;

exec与系统完全相同,只是它永远不会返回。它通过调用另一个程序有效地结束了你的程序。

使用最适合您情况的那个。或者在这种情况下,由于您正在执行SQL,请考虑使用DBI模块。除了几个简单的命令之外,它绝对是一种更好的方法。

答案 1 :(得分:1)

您的"字符似乎错误。我不确定他们应该在哪里。

在第二行,字符串文字:

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

后面紧接着是

BACKUP