从字符串生成ARGV

时间:2015-01-07 11:34:24

标签: perl command-line command-line-arguments

我有一个设置,其中Perl程序希望通过略微修改的命令行参数重新运行。为了避免使用例如system调用两次启动Perl解释器(用户响应时间很重要),我想直接将新命令行解析为ARGV,然后重新运行新的ARGV数组。

问题是:是否有CPAN模块可以将命令行字符串解析为ARGV数组? (即:执行通常的单词拆分和引用删除)..

这是第一次蛮力尝试:

sub parse_string_arg {
    my ($line) = @_;

    my $reg = qr/( (?: " (?: [^"\\]++ | \\")*+") | # Item in "" with possible escaped "
                 (?: [^"\s]\S*+) )/x; # Item that is not in double quotes

    my $reg2 = qr/(?: (?<![\\])" | \\(?="))/x
      ;  # a quote with no backslash in front of it, or a backslash with a quote behind

    my @a = map { $_ =~ s/$reg2//g; $_ } # remove quotes and backslashes
      $line =~ /$reg/g;  # extract arguments

    return \@a;
}

注意:这还不能处理单引号中的字符串..

2 个答案:

答案 0 :(得分:2)

虽然我同意Sobrique的评论,但这似乎不太可能是解决潜在问题的最佳方法:是的,这样的模块似乎存在。至少在搜索&#34;解析命令行&#34;时会出现这种情况。在metacpan上。

https://metacpan.org/pod/Parse::CommandLine

我没有测试它。

答案 1 :(得分:2)

请注意,可以在@ARGV块内的Perl脚本中修改BEGIN

BEGIN {

    @ARGV = map s/regex/replace/r, @ARGV ;  # Transform
    push @ARGV, 'new', 'arguments';         # Add stuff
    shift @ARGV;
}

# @ARGV now changed