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

Perl to exec a program with arguments containing "@"

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

Situation:

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

Problem:

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

注意:如果我将带有转义“@”字符的硬编码字符串作为命令参数传递给 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. 使用此 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>
    

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

作为 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>

如果您查看 Trying to convert Perl to PHP 中的 post 和调用命令行的 md5sum 实现中的代码,您会发现一种方法可以让您不必担心转义字符。