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 @

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

情况:

  • 我必须通过perl执行命令行程序
  • 此命令行的参数是电子邮件地址
  • 这些电子邮件地址通过另一个模块传递给我
  • 问题:

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

    注意:如果我将带有转义“@”字符的硬编码字符串作为命令args传递给exec(),则它可以正常工作

  • 创建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;
    }
    
  • 使用此参数映射执行程序的子对象

    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>