从字符串生成 ARGV

Generate ARGV from string

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

那么问题来了:有没有可以将命令行字符串解析成ARGV数组的CPAN模块? (即:进行通常的单词拆分和引号删除)..

这是第一次暴力尝试:

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;
}

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

虽然我同意 Sobrique 的评论,即这似乎不太可能是解决您的潜在问题的最佳方法:是的,这样的模块似乎存在。至少在 metacpan 上搜索 "parse commandline" 时会出现这种情况。

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

我没测试过

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

BEGIN {

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

# @ARGV now changed