Perl 语法错误:在操作员期望的位置找到了裸字

Ste*_*rds 0 perl config sql-server-2008

这是我的 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'" ";
Run Code Online (Sandbox Code Playgroud)

有人帮助我吗?

dan*_*111 5

当字符串中包含双引号时,需要使用 进行转义\

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

另外,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'" |;
Run Code Online (Sandbox Code Playgroud)

等等...

更新:如何在 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
Run Code Online (Sandbox Code Playgroud)

system执行命令并等待它返回。返回值是程序的退出状态。

my @results = `$cmd`;  #Always goes through shell.
Run Code Online (Sandbox Code Playgroud)

反引号执行命令并返回其输出。仅当您确实需要输出时才应该使用它;否则,最好与 一起去system

exec $cmd;
exec @command_and_args;
Run Code Online (Sandbox Code Playgroud)

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

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