如何在选项的子中访问Getopt :: Long选项的值?

时间:2011-03-12 07:12:13

标签: perl getopt-long

我的目标是拥有一个--override=f选项来操纵其他两个选项的值。诀窍是弄清楚如何在GetOptions检测到选项存在时执行的f中引用选项的值(与=f指示符中的sub匹配的部分)命令行。

以下是我的表现:

$ 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]包含值。魔法。

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

1 个答案:

答案 0 :(得分:7)

来自fine manual

  

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

因此,您所看到的行为已被记录下来,您应该对此保持安全。