Perl执行包含“@”的参数的程序

时间:2015-10-06 16:01:33

标签: perl perl-data-structures

是Perl的新手,需要帮助解决一个小问题

  

情况:

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

    问题:

    我已编写代码来从这些电子邮件地址创建参数列表,但在运行exec()时遇到问题。

    注意:如果我将带有转义的“@”字符的硬编码字符串作为命令args传递给exec(),它就能完美运行。

    1. 子创建cmd 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使用此args映射来执行程序

      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: <ashish@isthisreal.com>
        receiver_smtp: <areyouarealperson@somedomain.com>
      
    4. 有人可以指导我这里有什么问题吗?

2 个答案:

答案 0 :(得分:4)

作为shell中命令的参数,

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

导致字符串

-f=<ashish@isthisreal.com>

传递给程序。你的程序通过了

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

到该计划。问题不在于@;问题是您要添加的"\

my $mf = $msginfo->sender_smtp;
push @gd_args_msg, "-f=$mf";   # Assuming $mf is <ashish@isthisreal.com>

答案 1 :(得分:0)

如果查看Trying to convert Perl to PHP上的帖子以及调用命令行的md5sum实现中的代码,您将看到一种方法,可以避免担心转义字符。