3
我的目标是要有一个--override=f
选项来操作其他两个选项的值。窍门是找出在GetOptions检测到命令行中存在该选项时执行的sub
中如何引用该选项的值(与=f
代号中的f
匹配的部分)。如何在选项的sub中访问Getopt :: Long选项的值?
这里是我如何做它:
$ cat t.pl
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
our %Opt = (
a => 0,
b => 0,
);
our %Options = (
"a=f" => \$Opt{a},
"b=f" => \$Opt{b},
"override=f" => sub { $Opt{$_} = $_[1] for qw(a b); }, # $_[1] is the "trick"
);
GetOptions(%Options) or die "whatever";
print "\$Opt{$_}='$Opt{$_}'\n" for keys %Opt;
$ t.pl --override=5
$Opt{a}='5'
$Opt{b}='5'
$ t.pl --a=1 --b=2 --override=5 --a=3
$Opt{a}='3'
$Opt{b}='5'
的代码似乎处理选项和覆盖,就像我想要的。我发现在sub
,$_[0]
中包含该选项的名称(全称为名称,即使它在命令行中缩写),并且$_[1]
包含该值。魔法。
我还没有看到这个记录,所以我关心我是否在不知不觉中使用这种技术犯了任何错误。
Errf,我看了这段文字,并没有饶恕它包含我的答案。非常感谢您的重新关注。 – 2011-03-12 07:41:06
@Cary Millsap:公平地说,附近的例子没有说明处理程序的参数,它只是显示简单的开/关情况,这个例子可能是你吸引人的眼球。 – 2011-03-12 18:23:37