我有一个设置,其中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;
}
注意:这还不能处理单引号中的字符串..
答案 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