Perl中的反斜杠单引号
Posted
技术标签:
【中文标题】Perl中的反斜杠单引号【英文标题】:Back-slashing single quotes in Perl 【发布时间】: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
,但这也会反斜杠空格。
【问题讨论】:
String::ShellQuote?? 你也可以切换到Mail::Sender,这样你就不用引用任何东西了。$DBI::errstr
的值是多少?里面有单引号吗?
【参考方案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");
【讨论】:
以上是关于Perl中的反斜杠单引号的主要内容,如果未能解决你的问题,请参考以下文章