2011-08-03 112 views
2

我試圖創建一個腳本/應用程序,它接受運行時的命令行參數。當然,這是一個日常的事情,但看到這是我第一次這樣做,我正在尋找一些指導。比方說,我的腳本可以利用這些類型的命令行參數:在Perl腳本中處理命令行參數的正確方法是什麼?

script -a -p /path/to/pipe -l mail.Error -m [email protected] 
script -a -l mail.Error -m [email protected] -p /path/to/pipe 

and so on.... 

由於命令行腳本的靈活特性,參數,你可以通過它可以將部分按照各種順序,並可能會丟失/有無效的參數。現在,我知道這可以是非常嚴格的參數必須如何顯示(第一-a,然後-p與路徑,然後-l用日誌工具/優先級,最後-m一個有效的電子郵件),並通過測試所有可能得到解決它們的發生。

但是,必須有一個更好的辦法。這是非常低效的(對我來說),我想知道是否有更好的做事方式。我希望儘可能保持靈活性,讓事情順利進行,而不是專注於嚴格的使用。

回答

6

我用Getopt::Long的參數。

未經測試的例子:

use Getopt::Long; 
## set defaults 
my $path = '/tmp'; 
my $log = 'm.Error'; 
my $email = '[email protected]'; 
my $a = 0; 
my $result = GetOptions ("path=s" => \$path, 
         "log=s" => \$log, 
         "a"  => \$a, 
         "email=s" => \$email); 
## both script -a -p /path/to/pipe -l mail.Error -m [email protected] 
## and script -a -l mail.Error -m [email protected] -p /path/to/pipe 
## should work now 
+0

你也可以傳遞'GetOptions'作爲散列引用,它將存儲所有的信息到散列。例如,給定'GetOptions(\%選擇 「路徑= S」, 「日誌= S」)''傳遞-path/tmp'會給你'$ {選擇路徑} == 「/ tmp目錄」'。我發現從代碼中的命令行選項中獲取信息很方便。 –

2

使用Getopt::Std如果你只想1個字符的選項,如果你想支持更長的參數名Getopt::Long

+2

只要總是使用'Getopt :: Long' - 它可以處理兩者。 – tchrist

+0

是的,但是'的Getopt :: Std'使得捆綁有點更簡單,例如治療'-abc'爲'-a -b -c'(在不上交長選項所有的費用)。就個人而言,我不使用捆綁,並且多年來我沒有使用'Getopt :: Std'。對於血腥細節,'perldoc Getopt :: Long'並閱讀「捆綁」部分(有幾個配置選項)。 –

0

Getopt::Long可以在命令行自動解析到一個散列變量。命令行上的順序無關緊要。您可以通過檢查散列鍵來檢查是否給出選項。

use warnings; 
use strict; 
use Getopt::Long; 

my %opts; 
GetOptions(\%opts, qw(a p=s l=s m=s)) or die; 
相關問題