【问题标题】:Perl Syntax Error: bareword found where operator expectedPerl 语法错误:在操作员预期的位置找到了裸字
【发布时间】:2012-10-22 16:20:34
【问题描述】:

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

有人帮帮我吗?

【问题讨论】:

    标签: perl sql-server-2008 config


    【解决方案1】:

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

    $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 与 system 完全相同,只是它永远不会返回。它通过调用另一个程序有效地结束您的程序。

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

    【讨论】:

    • 我还有一个疑问。从 perl 脚本运行这个 sql 查询的命令是什么
    • @StefanEdwards,我用运行系统命令的信息更新了答案。如果您遇到麻烦,根据我的经验,首先要看的是引用。这可能很挑剔,尤其是在 Windows 上时。我知道关于 SO 的其他一些问题已经解决了这个问题。
    【解决方案2】:

    您的 " 字符似乎放错了位置。我不确定它们应该在哪里。

    在你的第二行,字符串文字:

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

    紧随其后的是裸词

    BACKUP
    

    【讨论】:

    • 我改变了这样的代码 $cmd .= "-U $user_name -P $password -S $host -d master -Q "."BACKUP DATABASE [$database_name] TO DISK = N' $path'" ;
    • @StefanEdwards:值得怀疑。我从你的评论中复制并粘贴了这行代码,它编译没有错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2023-03-13
    • 2022-11-16
    • 1970-01-01
    • 2019-01-23
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多