2011-03-12 97 views
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]包含该值。魔法。

我还没有看到这个记录,所以我关心我是否在不知不觉中使用这种技术犯了任何错误。

回答

7

fine manual

当GetOptions()遇到的选项,它会调用子程序有两个或三个参数。第一个参数是选项的名称。 (实际上,它是一个将对象的字符串化为选项的名称)。对于标量或数组目标,第二个参数是要存储的值。对于散列目标,第二个参数是散列键,第三个参数是要存储的值。

因此,你所看到的行为是有记录的,你应该对它安全。

+0

Errf,我看了这段文字,并没有饶恕它包含我的答案。非常感谢您的重新关注。 – 2011-03-12 07:41:06

+1

@Cary Millsap:公平地说,附近的例子没有说明处理程序的参数,它只是显示简单的开/关情况,这个例子可能是你吸引人的眼球。 – 2011-03-12 18:23:37

相关问题