从字符串生成 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
我有一个设置,其中 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