2011-03-12 98 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

相關問題