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