perl程式的引數會被放在@ARGV這個陣列中,而程式名稱會被放在$0這個特殊變數裡。
我們可以很簡單的用
$ARGV[0]取得第一個引數
$ARGV[1]取得第二個引數
依此類推
想要知道引數有幾個,可以這樣取得
my $arg_cnt=scalar @ARGV;

標準的perl版本提供兩個解析命令列的模組:Getopt::Std和Getopt::Long

Getopt::Std模組支援單一switch字元,並設定名稱為$opt_x變數的值,其中x是選項所用的字母。
use Getopt::Std;
getopt(ab);
print "a is $opt_a\n" if defined $opt_a;
print "b is $opt_b\n" if defined $opt_b;


也可以是供一個指向雜湊的參考給getopt,這個雜湊所儲存的正是命令列的引數對。
use Getopt::Std;
use strict;
my(%args, $switch);
getopt('ab', \%args);
foreach $switch(sort keys %args){
print "$switch = $args{$switch}\n";
}

在命令列執行 perl aaa.pl -a aaa -b bbb
輸出結果為
a = aaa
b = bbb
上面使用了strict的功能,如果使用strict卻未使用雜湊參考指標,這樣就必須在變數名稱之前加上package的名稱,如$main::opt_a。

Getopt::Std也提供getopts的功能,允許布林引數和一孺的選項引數。若選項後需要接上引數,那麼其後將會接上冒號。所以如'ab:'的字串表示選項a是一個布林選項,因此不需要任何引數。選項b則需要引數。
use Getopt::Std;
use strict;
my(%args, $switch);
getopt('ab:', \%args);
foreach $switch(sort keys %args){
print "$switch = $args{$switch}\n";
}

在命令列執行 perl aaa.pl -a -b bbb
輸出結果為
a = 1
b = bbb

Getopt::Long模組是getopt的一個延伸。其中實作了一個GetOptions的函式。GetOptions支援具有長檔名的選項以及單一的字元,並且會檢查引數的資料型態(字串、整數、浮點數)來確保它們正確無誤。GetOptions會將-或--兩個符號視為swith的先行字元。
呼叫GetOptions需要一個儲存選項對(option pairs)串列,選項對中的第一個成員是選項對的指定敘述,整二個成員是選項對連結(option linkage),也就是一個指向選項變數的參考。
use Getopt::Long;
use strict;
my($filename, $regex);
GetOptions("filename=s", \$filename, "$regex=s", \$regex);
usage() unless $filename && $regex;
sub usage{
print "usage: $0 -fname fname -regex regex\n";
}

上面的filename=s是指此選項必須有一個字串引數。

GetOptions如果使用常式參考當做選項連結,當設定此選項時,會呼叫此函數。
use Getopt::Long;
use strict;
GetOptions("help", \&usage);
sub usage{
print "usage: $0\n";
}


基本上在處理選項時,Getopt::Long使用大小寫無關(case-insensitive)的比對方式,以下設定可以改變它。
Getopt::Long::Config('no_ignore_case');

jck11 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • 昱霖 吳
  • 想知道命令列引數的數量還有一種做法 $#ARGV + 1