gpt4 book ai didi

perl - 如何使用Getopt::Long解析可能带有空格的参数?

转载 作者:行者123 更新时间:2023-12-01 17:08:49 31 4
gpt4 key购买 nike

我有一个shell脚本,其内容如下所示:

prog_name -options ...

具体来说,例如:
prog_name -filter_arg +define BOOST +noconvtest +actuate-long -disp_arg +define size=40 res=30
请注意,上面没有引号,而且我无权修改Shell脚本。 [但是,我不确定是否可以通过其他程序在上述语法中插入引号。]

现在,我想将以上内容发送到Perl程序以解析选项,以便其关联 +define BOOST +noconvtest +actuate-long到选项 -filter_arg+define size=40 res=30到选项 -disp_arg

有人可以帮我吗?

最佳答案

Getopt::Long只是解析提供给Perl程序的@ARGV列表。如果参数是@ARGV列表中的单独条目,则Getopt::Long将以这种方式解析它们。您的问题是外壳程序将每个参数作为单独的参数放置,因为它们周围没有引号。

您的选择是在运行Perl脚本之前对参数进行修改,或者对@ARGV本身进行修改以将参数组合为它们应该包含的值。

对于第一个选项,您可以使用sed获取程序的输出并添加缺少的引号。如果您正在编程,请始终吐出如下字段:

prog_name -filter_arg +define BOOST +noconvtest +actuate-long -disp_arg +define size=40 res=30

您可以像这样通过 sed传递它:
$ orig_prog | sed -e 's/filter_arg /filter_arg "/' -e 's/ -disp_arg /" -disp_arg "/' -e 's/$/"/'

或这个:
$ orig_prog | sed -e 's/^\(.*\) -filter_arg \(.*\) -disp_arg \(.*\)$/\1 -filter_arg "\2" -disp_arg "\3"/'

这会将引号括在您的参数中,看起来像这样:
prog_name -filter_arg "+define BOOST +noconvtest +actuate-long" -disp_arg "+define size=40 res=30"

这样,正确设置了 @ARGV,因此 GetOptions函数将按照您希望的方式工作。

另一种方法是在Perl程序运行后对 @ARGV进行调优,然后再调用 GetOptions:
my $value;
my @newArgv;
foreach my $param (@ARGV) {
if ($param =~ /^-/) {
if ($value) {
push (@newArgv, $value);
$value = "";
}
push(@newArgv, $param);
} else {
$value = $value ? "$value $param" : "$param";
}
}
push (@newArgv, $value) if ($value);
@ARGV = @newArgv;

在上面的示例中, @ARGV将具有以下值:
@ARGV[0] = -filter_arg
@ARGV[1] = +define BOOST +noconvtest +actuate-long
@ARGV[2] = -disp_arg
@ARGV[3] = +define size=40 res=30

而且, Getopts::Long现在应该可以按照您希望的方式工作。 一点注释:在较新版本的 Getopt::Long中,您可以使用 @ARGV以外的其他数组。您只需将要用作第一个参数的数组放在 GetOptions中:
use Getopt::Long qw(GetOptionsFromArray);

GetOptionsFromArray (
\@newArgs,
"filter_arg=s" => \$filter_arg,
"disp_arg=s" => \$disp_arg,
);

关于perl - 如何使用Getopt::Long解析可能带有空格的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4257306/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com