2015-10-06 33 views
1

我在Perl中的新手,需要有一个小问题,帮助Perl来exec的程序包含参数“@”

现状:

  1. 我必须执行一个命令行程序通过perl。
  2. 该命令行的参数是电子邮件地址
  3. 这些电子邮件地址通过另一个模块传递给我。

问题:

我写的代码来创建这些电子邮件地址的参数列表,但我在运行EXEC有问题()。

注意:如果我将具有转义“@”字符的硬编码字符串作为命令参数传递给exec(),它将完美工作。

  1. 子创建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; 
    } 
    
  2. 子映射到执行的是计划

    sub check { 
        my($self, $msginfo) = @_; 
        my $cmd = $g_command; 
        my @cmd_args = create_cmd_args($self, $msginfo); 
        exec($cmd, @cmd_args); ### ******* fails here 
    } 
    
  3. 采样运行:

    INPUT: 
        sender_smtp: <[email protected]> 
        receiver_smtp: <[email protected]> 
    

有人请指导我这里有什么问题吗?

+1

您可能会在这里找到'quotemeta'功能。但是如果你可以打印'@ cmd_args'的内容,这样会很有用,所以我们可以看到插值是如何破坏的,因为我们无法确定输入在代码中的处理方式。 – Sobrique

+0

感谢您的帮助。我也会尝试quotemeta。自卸车的当前调试输出是完美的。 ----> -f =“<[email protected]>”-r =“

+0

请注意,我还没有发布整个代码(也被截断的subs),只是相关的部分,因为有很多更多的选项被传递到命令行,这里有更多的东西在做。 –

回答

4

如在壳的参数的命令时,

-f="<[email protected]>" 

使字符串

-f=<[email protected]> 

要传递给该程序。您的程序通过

-f="<ashish\@isthisreal.com>" 

到程序。问题不是@;问题是您要添加的"\

my $mf = $msginfo->sender_smtp; 
push @gd_args_msg, "-f=$mf"; # Assuming $mf is <[email protected]> 
+0

ikegami,如果你正在谈论 - > $ mf =〜s/@/\\ @/ig; ##试图转义@,结果不正确,那么我已经尝试过没有它,结果是一样的.. –

+1

正确的,删除​​'///'只是删除你的错误修复,你仍然需要解决原来的问题,我解释了什么是问题,以及如何在我的答案中修复它。请重新阅读。 – ikegami

+0

再次感谢。不幸的是,电子邮件addr中的“<" & ">”字符在bash中会产生问题,如果它们不在引号中,并且我使用“-f = $ mf”进行测试,if我尝试打印它,“@isthsreal”扩展为“',除非我升级pe it。请让我知道我在这里做错了什么。 –

0

如果你看一下在后,并Trying to convert Perl to PHP调用命令行,你会看到一个方法,将节省您不必担心转义字符的md5sum执行中的代码。