【问题标题】:Back-slashing single quotes in PerlPerl中的反斜杠单引号
【发布时间】:2014-06-19 17:34:39
【问题描述】:

我遇到过单引号在系统调用中导致 Bash 'unterminated quoted string' 错误的情况。在这种特定情况下,我试图将 $DBI::errstr 插入到 bash 命令中。我在系统调用中使用:

system "echo '$DBI::errstr' | mail -s 'error' usr@mail.com";

所以$DBI::errstr 有时会包含单引号并导致错误。我知道我可以将 $DBI::errstr 括在反斜杠双引号 \"$DBI::errstr\" 中并收工,但必须有更好的方法来处理引号而不使用正则表达式或编写子例程,我很难找到.我也试过quotemeta,但这也会反斜杠空格。

【问题讨论】:

  • 你也可以切换到Mail::Sender,这样你就不用引用任何东西了。
  • $DBI::errstr 的值是多少?里面有单引号吗?

标签: perl quotes


【解决方案1】:

没有充分的理由在 Perl 中使用 system echo。您可以简单地将管道作为文件句柄打开并打印到它:

open my $mail, '|-', qw/mail -s error usr@mail.com/ or die $!;
print $mail $DBI::errstr, "\n";

编辑:但要更笼统地回答您的问题。与其依赖 shell 来解析和取消引用命令行字符串并将其转换为参数,不如使用 system() 的显式多参数形式通常是一个更好的主意。因此,您可以使用system("some_command", "--arg=$val"),而不是system "some_command --arg=$val" 和担心是否需要为shell 引用$val。

【讨论】:

  • 打开管道非常适合我的情况,我相信 system() 的多参数形式在不久的将来会非常有用 +1
  • +1 以获得非常流利的答案。但是qw/ mail -s error usr@mail.com / 会更好;并且任何 die 都应该有 something 作为参数,特别是 $! 如果合适的话,就像这里一样
  • @Borodin,将'mail', '-s', 'error', 'usr@mail.com' 语法归咎于@ikegami。关于美元的好点!现已修复。
  • 这个答案的第一个版本对我来说很好。 open my $mail, "| mail -s 'error' usr@mail.com"; 引用shell命令的每一部分有什么好处?
  • 使用多参数的全部意义在于可以将变量用于电子邮件地址,而qw 不允许这样做。它看起来难看的主要原因是缺少括号,但我不想改变你的风格。如果您不想使用'mail', '-s', 'error', $email_addr,也可以使用mail => ( -s => 'error', $email_addr)
【解决方案2】:

如果你打算使用system,你会这样做:

use String::ShellQuote qw( shell_quote );

my $cmd1 = shell_quote('echo', $DBI::errstr);
my $cmd2 = shell_quote('mail', '-s', 'error', $email_addr);
system("$cmd1 | $cmd2");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    相关资源
    最近更新 更多