<代码>Getopt:Long只是按“Perl”方案提供的@ARGV
清单。 如果参数是@ARGV
list中的单独条目,Getopt:Long
将按此方式分类。 你们的问题是,由于他们没有被援引,因此把每一论点作为单独的参数。
Your choice is to either munge the parameters before your Perl script runs, or by munging @ARGV
itself to combine the parameters into the values they re suppose to be in.
在第一种选择中,您可使用sed
,以取得您的方案成果并在缺失的引述中添加。 如果你重新规划,就总是在这样的领域:
prog_name -filter_arg +define BOOST +noconvtest +actuate-long -disp_arg +define size=40 res=30
可通过<条码>传送条码>。 类似:
$ 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"
That way, @ARGV
will be setup correctly so the GetOptions
function will work the way you want it to.
另一种方式是,一旦你在请上<代码>GetOptions<> 代码>之前重新实施“Perl”方案,即打上“munge @ARGV
:
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/code>的第一个论点:
use Getopt::Long qw(GetOptionsFromArray);
GetOptionsFromArray (
@newArgs,
"filter_arg=s" => $filter_arg,
"disp_arg=s" => $disp_arg,
);