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中的反斜杠单引号的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中的反斜杠 \,真是太坑了!!

MySQL 中的反斜杠 \,真是太坑了!!

在 MySQL 中的反斜杠 \,太反人类了!!

MySQL 中的反斜杠 \,真是太坑了!!

MySQL 中的反斜杠 \,真是太坑了!!

MySQL 中的反斜杠 \,真是太坑了!!