Perl来执行参数包含“的程序”@&引用;
我是Perl的新手,需要帮助解决一个小问题 情况:Perl来执行参数包含“的程序”@&引用;,perl,perl-data-structures,Perl,Perl Data Structures,我是Perl的新手,需要帮助解决一个小问题 情况: 我必须通过perl执行命令行程序 此命令行的参数是电子邮件地址 这些电子邮件地址通过另一个模块传递给我 问题: 我已经编写了从这些电子邮件地址创建参数列表的代码,但在运行exec()时遇到问题 注意:如果我将带有转义“@”字符的硬编码字符串作为命令args传递给exec(),则它可以正常工作 创建cmd args映射的子对象 sub create_cmd_args { my($self, $msginfo) = @_; my @
sub create_cmd_args {
my($self, $msginfo) = @_;
my @gd_args_msg = ('--op1');
my $mf = $msginfo->sender_smtp;
$mf =~ s/@/\\@/ig; ## Tried escaping @, incorrect results.
push @gd_args_msg, '-f="'.$mf.'"';
for my $r (@{$msginfo->per_recip_data}) {
my $recip = $r->recip_addr_smtp;
$recip =~ s/@/\\@/ig; ## Tried escaping @, incorrect results.
push @gd_args_msg, '-r="'.($recip).'"';
}
return @gd_args_msg;
}
sub check {
my($self, $msginfo) = @_;
my $cmd = $g_command;
my @cmd_args = create_cmd_args($self, $msginfo);
exec($cmd, @cmd_args); ### ******* fails here
}
INPUT:
sender_smtp: <ashish@isthisreal.com>
receiver_smtp: <areyouarealperson@somedomain.com>
输入:
发件人\u smtp:
收件人(smtp):
有人能告诉我这里怎么了吗 作为shell中命令的参数
-f="<ashish@isthisreal.com>"
作为shell中命令的参数
-f="<ashish@isthisreal.com>"
如果您查看post at和调用命令行的md5sum实现中的代码,您将看到一种不必担心转义字符的方法。如果您查看post at和调用命令行的md5sum实现中的代码,您将看到一种可以节省您的方法无需担心转义字符。您可能会发现
quotemeta
函数在这里很有用。但是如果您可以打印@cmd_args
的内容,这样我们就可以看到插值是如何中断的,因为我们无法告诉您的代码是如何处理输入的。谢谢您的帮助。我也要试一下quotemeta。转储程序的当前调试输出是完美的。-->-f=“”-r=“”,请注意,我没有发布完整的代码(也是截断的subs)和相关部分,因为还有更多的选项被传递到命令行,这里还有更多的工作要做。我刚刚发布了我认为与此相关的内容。如果需要更多详细信息,请告诉我。在执行exec命令之前,只需简单打印“$cmd@cmd_args”,然后查看即可。在这种情况下,您不能100%确定$cmd的所有输入都正常。您可能会发现quotemeta
函数在这里很有用。但是如果您可以打印@cmd_args
的内容,这样我们就可以看到插值是如何中断的,因为我们无法告诉您的代码是如何处理输入的。谢谢您的帮助。我也要试一下quotemeta。转储程序的当前调试输出是完美的。-->-f=“”-r=“”,请注意,我没有发布完整的代码(也是截断的subs)和相关部分,因为还有更多的选项被传递到命令行,这里还有更多的工作要做。我刚刚发布了我认为与此相关的内容。如果需要更多详细信息,请告诉我。在执行exec命令之前,只需简单打印“$cmd@cmd_args”,然后查看即可。在这种情况下,如果您谈论-->$mf=~s/@/\\\@/ig;,您不能100%确定$cmd的所有输入都是ok.ikegami尝试转义@,结果不正确,那么我已经尝试过了,没有转义,结果是一样的..对,删除s//
只会删除您的错误修复。您仍然需要解决原始问题。我在回答中解释了问题所在以及如何解决。请重读,再次感谢。不幸的是,email addr中的“”字符如果不在引号中,就会在bash中产生问题。另外,我测试了“-f=$mf”,如果我试图打印它,“@IsthReal”将扩展为“”,除非我转义它。如果我在这里做错了什么,请告诉我。您的exec$cmd,LIST
运行$cmd
,而不是bash。没有涉及炮弹。不需要保护特殊的shell字符。而且没有shell应用您添加的引号和反斜杠,因此它们被传递到$cmd
.re“另外,我使用“-f=$mf”进行了测试”,如果我尝试打印它,“@IsthReal”被扩展为“”,这不是真的。如果“-f=$mf”
的输出不包含@isthsreal
,那么$mf
首先不包含@isthsreal
。ikegami,如果您正在谈论-->$mf=~s/\\\@/ig;#尝试转义@,结果不正确,那么我已经尝试过了,没有转义,结果是一样的..对,删除s//
只会删除您的错误修复。您仍然需要解决原始问题。我在回答中解释了问题所在以及如何解决。请重读,再次感谢。不幸的是,email addr中的“”字符如果不在引号中,就会在bash中产生问题。另外,我测试了“-f=$mf”,如果我试图打印它,“@IsthReal”将扩展为“”,除非我转义它。如果我在这里做错了什么,请告诉我。您的exec$cmd,LIST
运行$cmd
,而不是bash。没有涉及炮弹。不需要保护特殊的shell字符。而且没有shell应用您添加的引号和反斜杠,因此它们被传递到$cmd
.re“另外,我使用“-f=$mf”进行了测试”,如果我尝试打印它,“@IsthReal”被扩展为“”,这不是真的。如果“-f=$mf”
的输出不包含@isthsreal
,则$mf
首先不包含@isthsreal
。
-f="<ashish\@isthisreal.com>"
my $mf = $msginfo->sender_smtp;
push @gd_args_msg, "-f=$mf"; # Assuming $mf is <ashish@isthisreal.com>