2017-04-18 58 views
3

Perl的Getopt::Long允許開發人員將其自己的選項添加到腳本中。如正則表達式中所示,也可以通過use of a repeat specifier允許多個值作爲選項。例如:在散列中添加Getopt :: Long選項,即使使用重複說明符

GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color); 

此外,option values can be stored in a hash,就像這樣:

my %h =(); 
GetOptions(\%h, 'length=i'); # will store in $h{length} 

我想要做的是,結合這兩種方法與我的選擇哈希結束了,即使他們有多個值。例如,我想要允許三個選項:生日(三個整數),父母(一個或兩個字符串),名字(正好一個字符串)。 我們還要說,我想把這些值放到哈希中。我試過如下:

use strict; 
use warnings; 

use Getopt::Long; 
use Data::Dumper; 

my %h =(); 
GetOptions(\%h, 'bday=i{3}', 'parents=s{1,2}', 'name=s{1}'); 

print Dumper(\%h); 

而且測試,但輸出如下:

perl optstest.pl --bday 22 3 1986 --parents john mary --name ellen 
$VAR1 = { 
    'name' => 'ellen', 
    'parents' => 'mary', 
    'bday' => 1986 
}; 

只有每個選項的最後一個值在哈希實際使用。我想什麼,雖然是:

$VAR1 = { 
    'name' => 'ellen', 
    'parents' => ['mary', 'john'], 
    'bday' => [22, 3, 1986] 
}; 

如果「艾倫」將是一個數組,或者如果一切是一個哈希裏,我不會有事的爲好。

是不可能將Getopt::Long這兩個功能組合起來,即將選項放入散列中並使用重複說明符?

回答

6
use Getopt::Long; 
# enable for debugging purposes 
# Getopt::Long::Configure("debug"); 
use Data::Dumper; 

my %h =(); 
GetOptions(\%h, 'bday=i{3}', '[email protected]{1,2}', '[email protected]{1}'); 

print Dumper(\%h); 

的一部分,它報告給Perl 5的行李搬運這是你想要的嗎?

$VAR1 = { 
      'bday' => 1986, 
      'name' => [ 
         'ellen' 
        ], 
      'parents' => [ 
         'john', 
         'mary' 
         ] 
     }; 
+0

我想'bday'作爲一個數組,但的確如此。我需要'@ {}'表示法。謝謝! –

3

如果你想要一個數組,你需要給它一個數組的引用。或者您需要指定您想要的數組。

local @ARGV = qw(--x y z); 
GetOptions(\my %h, '[email protected]{2}'); 
print(Dumper(\%h)); 

輸出:

$VAR1 = { 
      'x' => [ 
        'y', 
        'z' 
       ] 
     }; 
+0

感謝您的回答!我真的不喜歡第一種選擇。首先,因爲即使未在CLI中指定選項,它也會生成空數組。這是不實際的:即使沒有設置,簡單地檢查'exists $ h {'選項'}'選項是否存在將始終返回true。我無法想象GetOpt的開發人員打算如此使用。第二個建議確實可以正常工作,所以我會使用它。謝謝。 –

1

文檔的Options with multiple values節鏈接到也表示,這

警告:下面是一個實驗性的功能。

它說較早前

GetOptions(\%H, '顏色= S @'); #將推動@ {$ H {顏色}}

所以我想,這是作者的意圖,它的工作與重複符以同樣的方式,並且已發現了一個bug

我建議你使用perlbug實用程序,Perl的安裝

+1

考慮到這裏的其他答案,你還認爲這是一個錯誤?使用'@ {1,2}''的建議答案可以正常工作,但也許你認爲它應該在沒有類型聲明的情況下工作? –

+0

@BramVanroy:絕對。如果您使用的語法不正確,那麼它不應該被模塊接受。如果它是正確的,那麼它應該工作。在任何情況下,它都不應該默默地「失去」除了一個已被明確定義爲多值的參數的所有值。如果你願意,我會自己提出這個問題嗎? – Borodin

+0

@BramVanroy:我想我是說'父母= {{1,2}''應該總是表現爲'父母= {@ {1,2}'',因爲把這樣一個值看成一個簡單的標量是無稽之談。 – Borodin

相關問題