2013-04-09 48 views
0

我必須在散列數組中使用GetOptions如何在perl中使用hash和getopts

我的要求是寫一個Perl腳本與例如多個選項 組合:

test.pl -a mango -s ripe -d <date value> 

test.pl -a apple -s sour 

其中mangoripeapplesour等是用戶輸入它也用於綁定SELECT查詢的SQL WHERE子句中的變量以生成報告。

我這個代碼

use vars qw ($opt_a $opt_s $opt_d) 
Getopts('a:s:d:') 

現在我以書面哈希

my %hash = @ARGV 

是上述散列定義是正確面臨的一個問題?有沒有更好的方法來使用哈希?

+1

你爲什麼要這麼做?您已經處理了命令行。你不需要做'my%hash = @ARGV;'。你是說你想使用後者而不是使用Getopts? – imran 2013-04-09 17:25:42

+0

嗨Imran實際上,帶有命令行參數的值被輸入到where子句中的select查詢中以生成報告,並且@ARGV將參數存儲在其內置數組中,因此基於給定的組合,我想生成報告,這就是爲什麼我想要使用哈希。請通過任何示例代碼向我推薦任何解決方案。 – perladdiction 2013-04-09 17:54:12

+0

如果你想要的鍵是「-a」,「-s」和「-d」,那麼是的,散列定義是正確的。如果用戶沒有通過所有必需的參數,則需要檢查如果他們通過-d沒有價值或者他們根本不通過-d。這就是爲什麼使用預測試模塊是一個好主意。 – imran 2013-04-09 18:22:44

回答

6

不,這個哈希「定義」是不正確的。如果給出-amango -sripe命令行,會發生什麼情況?你會得到一個「-amango => -sripe」的散列。如果給出-amango -s ripe,那麼@ARGV的大小將是奇數,並且會顯示警告(如Odd number of elements in hash assignment at ./x.pl line 6.)。

您可以直接使用getopts創建散列。嘗試:

use strict; 
use warnings; 
use Getopt::Std; 

my %opts; 
getopts("a:s:d:", \%opts) or die; 

while (my($k, $v) = each %opts) { 
    print "$k => $v\n"; 
} 

輸出與-amango -s ripe ARGS呼籲:

a => mango 
s => ripe