我的目标是有一个--override=f选项来操纵其他两个选项的值.诀窍是解决如何参考选项的值(匹配部分f中=f的标志符)sub的是执行的时候GetOptions检测在命令行上的选项的存在.
我是这样做的:
$ 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'
Run Code Online (Sandbox Code Playgroud)
代码似乎像我想要的那样处理选项和覆盖.我发现在其中sub,$_[0]包含选项的名称(全名,即使它在命令行中缩写),并$_[1]包含该值.魔法.
我没有看到这个记录,所以我担心我是否在不知不觉中使用这种技术犯了任何错误.