我在Perl中的新手,需要有一个小问题,帮助Perl来exec的程序包含参数“@”
现状:
- 我必须执行一个命令行程序通过perl。
- 该命令行的参数是电子邮件地址
- 这些电子邮件地址通过另一个模块传递给我。
问题:
我写的代码来创建这些电子邮件地址的参数列表,但我在运行EXEC有问题()。
注意:如果我将具有转义“@”字符的硬编码字符串作为命令参数传递给exec(),它将完美工作。
子创建CMD ARGS地图使用该ARGS
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: <[email protected]> receiver_smtp: <[email protected]>
有人请指导我这里有什么问题吗?
您可能会在这里找到'quotemeta'功能。但是如果你可以打印'@ cmd_args'的内容,这样会很有用,所以我们可以看到插值是如何破坏的,因为我们无法确定输入在代码中的处理方式。 – Sobrique
感谢您的帮助。我也会尝试quotemeta。自卸车的当前调试输出是完美的。 ----> -f =“<[email protected]>”-r =“
请注意,我还没有发布整个代码(也被截断的subs),只是相关的部分,因为有很多更多的选项被传递到命令行,这里有更多的东西在做。 –