2011-11-26 37 views
2

我得到了下面的代碼,可以按照我的需要工作,但想知道是否有更好的方法可以不使用引號。在Perl中使用Getopt :: Long來獲取多維數據結構

myScript.pl --filter 'key1 foo bar' --filter 'key2 baz qux' 

#!/usr/local/bin/perl5.8.8 
use warnings; 
use strict; 
use Getopt::Long; 
use Data::Dumper; 

my %filter; 

GetOptions("filter=s" => sub { my @args = split(/\s/, $_[1]); $filter{$args[0]}{value1} = $args[1]; $filter{$args[0]}{value2} = $args[2]; }); 

print Dumper %filter; 

我得到一個滿意的輸出:

$VAR1 = 'key2'; 
$VAR2 = { 
      'value1' => 'baz', 
      'value2' => 'qux' 
     }; 
$VAR3 = 'key1'; 
$VAR4 = { 
      'value1' => 'foo', 
      'value2' => 'bar' 
     }; 

不過,我想用它這樣的,不帶引號:

myScript.pl --filter key1 foo bar --filter key2 baz qux --other_option ... 

鍵1和鍵2是哈希鍵這裏會獨一無二。

任何意見/建議?

回答

4

當我上次檢查時(幾年前),CPAN上列出的20-30個Getopt模塊中沒有一個會處理您顯示的一串參數,並且我知道大部分基於C的參數解析代碼不處理這一點。 (我確實有一個C代碼解析器來處理它,只要知道需要消耗多少參數。不清楚是否需要1個鍵和2個值,或者值列表是否可以比這個更易變。)


也許我沒仔細看。

Getopt::Long有權選擇:

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

選項可以一次取多個值,例如

--coordinates 52.2 16.4 --rgbcolor 255 255 149 

這可以通過添加一個重複說明符來選擇規範來實現。重複說明符與可用於正則表達式模式的{...}重複說明符非常相似。例如,上述命令行的處理方式如下:

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

該選項的目標必須是數組或數組引用。

也可以指定選項所需的最小和最大參數數量。 foo=s{2,4}表示至少需要兩個參數和至多四個參數的選項。 foo=s{,}指示一個或多個值; foo:s{,}表示零個或多個選項值。

這將生成一個數組,其中包含鍵和兩個值。鑑於這需要與具有多個條目(每個--filter一個)的能力相結合,您可能仍然運氣不佳,但您應該仔細探索Getopt::Long

+0

謝謝!參數的數量將保持不變。 1個鍵和2個值。 – Wilderness

+0

是的。我讀過它,但沒有找到更多的線索來幫助我解決這個問題。正如你所建議的那樣,我使用了上面同樣的例子--filter1, - filter2等。沒關係。我會按原樣使用它。感謝您的建議。 – Wilderness

3

你可以使用選項名稱<>指定非選項參數的回調並適當地調整你的%filters散,像這樣:

GetOptions('filter=s' => \&set_filter, '<>' => \&non_option); 

我想像你@ARGV將最終爲空,除非您使用但是--

+0

謝謝!我試過這個,它工作。我在[這裏]找到了它(http://search.cpan.org/dist/Getopt-Long/lib/Getopt/Long.pm#Argument_callback)。 – Wilderness