Getopt::Long - 命令列選項的延伸處理
use Getopt::Long;
my $data = "file.dat";
my $length = 24;
my $verbose;
GetOptions ("length=i" => \$length, # numeric
"file=s" => \$data, # string
"verbose" => \$verbose) # flag
or die("Error in command line arguments\n");
Getopt::Long 模組實作一個延伸的 getopt 函式,稱為 GetOptions()。它會從 @ARGV
中分析命令列,辨識並移除指定的選項及其可能的值。
此函式遵循命令列選項的 POSIX 語法,並帶有 GNU 延伸。一般來說,這表示選項具有長名稱,而非單一字母,且以雙破折號「--」作為開頭。支援命令列選項的組合,就像較傳統的單字母方法一樣,但預設情況下未啟用。
命令列操作的程式傳統上從命令列取得其引數,例如程式需要知道的檔案名稱或其他資訊。除了引數之外,這些程式通常也會採用命令列選項。選項並非程式運作的必要條件,因此稱為「選項」,但可用於修改其預設行為。例如,一個程式可以安靜地執行工作,但透過適當的選項,它可以提供關於其所做工作的詳細資訊。
命令列選項有數種形式。傳統上,它們以單破折號 -
為前導,並由單一字母組成。
-l -a -c
通常,這些單字元選項可以組合
-lac
選項可以有值,值會置於選項字元之後。有時會在中間加上空白,有時則不會
-s 24 -s24
由於這些選項的性質非常難以理解,因此開發了另一種使用長名稱的樣式。因此,可以改用較具描述性的 --long
,而非難以理解的 -l
。為了區分單字元選項和長選項的組合,選項名稱之前會使用兩個破折號。早期實作長選項時,會改用加號 +
。此外,選項值可以指定如下
--size=24
或
--size 24
+
形式現已過時,且強烈建議不要使用。
Getopt::Long 是 newgetopt.pl
的 Perl5 後繼版本。這是第一個 Perl 模組,提供處理新式命令列選項,特別是長選項名稱的支援,因此 Perl5 名稱為 Getopt::Long。這個模組也支援單一字元選項和組合。
要從 Perl 程式使用 Getopt::Long,您必須在 Perl 程式中包含下列程式碼行
use Getopt::Long;
這將載入 Getopt::Long 模組的核心,並準備您的程式使用它。大多數實際的 Getopt::Long 程式碼直到您實際呼叫其中一個函式才會載入。
在預設組態中,選項名稱可以縮寫為唯一,大小寫無關緊要,即使是長選項名稱,單一破折號也已足夠。此外,選項可以放在非選項引數之間。有關如何組態 Getopt::Long 的更多詳細資訊,請參閱 "組態 Getopt::Long"。
最簡單的選項是不帶值的選項。它們在命令列上出現即可啟用選項。常見的範例為
--all --verbose --quiet --debug
處理簡單選項很簡單
my $verbose = ''; # option variable with default value (false)
my $all = ''; # option variable with default value (false)
GetOptions ('verbose' => \$verbose, 'all' => \$all);
呼叫 GetOptions() 會剖析 @ARGV
中存在的命令列引數,如果選項出現在命令列上,則將選項變數設定為值 1
。否則,不會變更選項變數。將選項值設定為 true 通常稱為啟用選項。
指定給 GetOptions() 函式的選項名稱稱為選項規格。稍後我們將看到,這個規格可以包含的不只是選項名稱。對變數的參照稱為選項目的地。
如果命令列可以順利處理,GetOptions() 將傳回 true 值。否則,它將使用 die() 和 warn() 撰寫錯誤訊息,並傳回 false 結果。
Getopt::Long 支援兩種有用的簡單選項變體:可否定的選項和遞增的選項。
可否定的選項在選項名稱後指定驚嘆號 !
my $verbose = ''; # option variable with default value (false)
GetOptions ('verbose!' => \$verbose);
現在,在命令列上使用 --verbose
將會啟用 $verbose
,正如預期的那樣。但也可以使用 --noverbose
,這將透過將其值設定為 0
來停用 $verbose
。透過使用適當的預設值,程式可以找出 $verbose
預設為 false,或透過使用 --noverbose
停用。
(如果同時給定 --verbose
和 --noverbose
,則以最後給定的為優先。)
遞增的選項在選項名稱後指定加號 +
my $verbose = ''; # option variable with default value (false)
GetOptions ('verbose+' => \$verbose);
在命令列上使用 --verbose
將會增加 $verbose
的值。這樣程式就能追蹤選項在命令列上出現的次數。例如,每次出現 --verbose
都會增加程式的詳細程度。
通常程式會接受命令列選項以及其他引數,例如檔案名稱。建議先指定選項,最後再指定其他引數。不過,Getopt::Long 會允許選項與引數混合,並在將其他引數傳遞給程式之前「篩選」所有選項。若要停止 Getopt::Long 處理其他引數,請在命令列上插入雙破折號 --
--size 24 -- --all
在此範例中,--all
不會 被視為選項,而是會原封不動地傳遞給程式,並儲存在 @ARGV
中。
對於需要值的選項,必須指定選項值是否為必要,以及選項預期的值類型。
支援三種值類型:整數、浮點數和字串。
如果選項值為必要,Getopt::Long 會採用選項後面的命令列引數,並將其指定給選項變數。但是,如果選項值指定為選用,則僅在該值本身看起來不像有效命令列選項時才會執行此動作。
my $tag = ''; # option variable with default value
GetOptions ('tag=s' => \$tag);
在選項規格中,選項名稱後面會接等號 =
和字母 s
。等號表示此選項需要值。字母 s
表示此值為任意字串。其他可能的類型為整數值的 i
和浮點數值的 f
。使用冒號 :
取代等號表示選項值為選用。在此情況下,如果未提供適當值,字串值選項會指定為空字串 ''
,而數字選項會設為 0
。
(如果同一個選項在命令列上出現多次,將會使用最後一個值。如果您想要採用所有值,請參閱下方說明。)
選項有時會採用多個值。例如,程式可以使用多個目錄來搜尋程式庫檔案
--library lib/stdlib --library lib/extlib
若要達成此行為,只要將陣列參考指定為選項的目的地即可
GetOptions ("library=s" => \@libfiles);
或者,您可以透過新增「@」來指定選項可以有多個值,並將參考傳遞給標量作為目的地
GetOptions ("library=s@" => \$libfiles);
與上述範例搭配使用,@libfiles
c.q. @$libfiles
在完成時將包含兩個字串:"lib/stdlib"
和 "lib/extlib"
,順序相同。也可以指定只有整數或浮點數才為可接受的值。
通常允許使用以逗號分隔的值清單以及選項的多個執行個體。這可以使用 Perl 的 split() 和 join() 運算子輕鬆達成
GetOptions ("library=s" => \@libfiles);
@libfiles = split(/,/,join(',',@libfiles));
當然,為每個目的選擇正確的分隔字串很重要。
警告:以下是實驗性功能。
選項可以一次採用多個值,例如
--coordinates 52.2 16.4 --rgbcolor 255 255 149
這可透過將重複規格符新增至選項規格來達成。重複規格符與可搭配正規表示式模式使用的 {...}
重複規格符非常類似。例如,上述命令列會以下列方式處理
GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color);
選項的目的地必須是陣列或陣列參考。
也可以指定選項所採用的最小和最大引數數目。foo=s{2,4}
表示採用至少兩個且最多 4 個引數的選項。foo=s{1,}
表示一個或多個值;foo:s{,}
表示零個或多個選項值。
如果選項目的地是雜湊的參考,選項將採用 key=
value 形式的字串作為值。值會儲存在雜湊中指定的鍵中。
GetOptions ("define=s" => \%defines);
或者,您可以使用
GetOptions ("define=s%" => \$defines);
與命令列選項搭配使用時
--define os=linux --define vendor=redhat
雜湊 %defines
(或 %$defines
) 將包含兩個鍵,"os"
的值為 "linux"
,"vendor"
的值為 "redhat"
。也可以指定只有整數或浮點數才為可接受的值。鍵永遠視為字串。
當命令列中遇到選項(實際上:每次遇到)時,可透過指定對子常式的參照(或匿名子常式)作為選項目的地,來達成對應當執行的動作的終極控制。當 GetOptions() 遇到選項時,它會使用兩個或三個引數呼叫子常式。第一個引數是選項的名稱。(實際上,它是一個字串化為選項名稱的物件。)對於標量或陣列目的地,第二個引數是要儲存的值。對於雜湊目的地,第二個引數是雜湊的鍵,第三個引數是要儲存的值。由子常式決定要儲存值,或執行它認為適當的任何動作。
此機制的平凡應用是實作彼此相關的選項。例如
my $verbose = ''; # option variable with default value (false)
GetOptions ('verbose' => \$verbose,
'quiet' => sub { $verbose = 0 });
在此,--verbose
和 --quiet
控制同一個變數 $verbose
,但值相反。
如果子常式需要發出錯誤訊號,它應該呼叫 die(),並將所需的錯誤訊息作為其引數。GetOptions() 會捕捉 die(),發出錯誤訊息,並記錄在完成時必須傳回錯誤結果。
如果錯誤訊息的文字以驚嘆號 !
開頭,GetOptions() 會特別解譯它。目前實作了一個特殊指令:die("!FINISH")
會導致 GetOptions() 停止處理選項,就像遇到雙破折號 --
一樣。
以下是如何在子常式中存取選項名稱和值的範例
GetOptions ('opt=i' => \&handler);
sub handler {
my ($opt_name, $opt_value) = @_;
print("Option name is $opt_name and value is $opt_value\n");
}
通常,為選項提供替代的助記名稱對使用者來說很友善。例如,--height
可以是 --length
的替代名稱。替代名稱可以包含在選項規格中,並以直線 |
字元分隔。要實作上述範例
GetOptions ('length|height=f' => \$length);
第一個名稱稱為主要名稱,其他名稱稱為別名。當使用雜湊儲存選項時,鍵永遠會是主要名稱。
可以有多個替代名稱。
在沒有其他設定的情況下,GetOptions() 會忽略選項名稱的大小寫,並允許選項縮寫為唯一。
GetOptions ('length|height=f' => \$length, "head" => \$head);
此呼叫會允許 --l
和 --L
作為長度選項,但至少需要 --hea
和 --hei
作為頭部和高度選項。
每個選項指定符包含兩部分:名稱規格和參數規格。
名稱規格包含選項名稱,可選擇後接由垂直線字元分隔的替代名稱清單。
length option name is "length"
length|size|l name is "length", aliases are "size" and "l"
參數規格為選用。如果省略,選項視為布林值,在命令列中使用選項時將指定值 1。
參數規格可以是
選項不帶參數,且可透過加上前綴「no」或「no-」來否定。例如,「foo!」
將允許 --foo
(指定值 1)以及 --nofoo
和 --no-foo
(指定值 0)。如果選項有別名,這也適用於別名。
在啟用組合時,對單一字母選項使用否定是沒有意義的,並且會產生警告。
選項不帶參數,且每次在命令列中出現時將遞增 1。例如,「more+」
與 --more --more --more
一起使用時,將遞增值三次,產生值 3(前提是最初為 0 或未定義)。
如果選項目的地不是純量,則會忽略 +
指定符。
選項需要指定類型參數。支援的類型為
字串。任意字元序列。參數以 -
或 --
開頭是有效的。
整數。可選擇加上正號或負號,後接一連串數字。
延伸整數,Perl 風格。這可以是可選擇加上正號或負號,後接一連串數字,或八進位字串(零,可選擇後接「0」、「1」...「7」),或十六進位字串(0x
後接「0」...「9」、「a」...「f」,不分大小寫),或二進位字串(0b
後接一連串「0」和「1」)。
實數。例如 3.14
、-6.23E24
等。
目的地類型 可以是 @
或 %
,用於指定選項是清單或雜湊值。這僅在選項值的目的地未另行指定時需要。不需要時應省略。
重複 指定此選項在命令列中每次出現時所帶的值數。其格式為 {
[ 最小值 ] [ ,
[ 最大值 ] ] }
。
最小 表示引數的最小數量。對於帶有 =
的選項,其預設值為 1,對於帶有 :
的選項,其預設值為 0,請參閱下方。請注意,最小 會覆寫 =
/ :
語意。
最大 表示引數的最大數量。它必須至少為 最小。如果省略 最大,但沒有省略逗號,則引數值數量沒有上限。
與 =
相同,但將引數指定為選用。如果省略,則會將空字串指定給字串值選項,並將值零指定給數字選項。
請注意,如果字串引數以 -
或 --
開頭,則它本身會被視為選項。
與 :i
相同,但如果省略值,則會指定 數字。
如果 數字 為八進位、十六進位或二進位,則其行為與 :o
相同。
與 :i
相同,但如果省略值,則會遞增選項的目前值。
Getopt::Long 也可以用物件導向的方式使用
use Getopt::Long;
$p = Getopt::Long::Parser->new;
$p->configure(...configuration options...);
if ($p->getoptions(...options descriptions...)) ...
if ($p->getoptionsfromarray( \@array, ...options descriptions...)) ...
組態選項可以傳遞給建構函式
$p = new Getopt::Long::Parser
config => [...configuration options...];
在版本 2.37 中,回呼函式的第一個引數已從字串變更為物件。這樣做是為了擴充和更詳細的控制。物件會字串化為選項名稱,因此此變更不應產生相容性問題。
回呼物件具有下列方法
從 Perl 5.8 開始,Getopt::Long 在使用 ithreads 時具有執行緒安全性。在使用 Perl 5.005 中新增的較舊 (實驗性和現在已過時的) 執行緒實作時,它沒有執行緒安全性。
Getopt::Long 鼓勵使用 Pod::Usage 來產生說明訊息。例如
use Getopt::Long;
use Pod::Usage;
my $man = 0;
my $help = 0;
GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
pod2usage(1) if $help;
pod2usage(-exitval => 0, -verbose => 2) if $man;
__END__
=head1 NAME
sample - Using Getopt::Long and Pod::Usage
=head1 SYNOPSIS
sample [options] [file ...]
Options:
-help brief help message
-man full documentation
=head1 OPTIONS
=over 8
=item B<-help>
Print a brief help message and exits.
=item B<-man>
Prints the manual page and exits.
=back
=head1 DESCRIPTION
B<This program> will read the given input file(s) and do something
useful with the contents thereof.
=cut
請參閱 Pod::Usage 以取得詳細資料。
預設情況下,GetOptions 會解析存在於全域陣列 @ARGV
中的選項。特殊項目 GetOptionsFromArray
可用於解析任意陣列中的選項。
use Getopt::Long qw(GetOptionsFromArray);
$ret = GetOptionsFromArray(\@myopts, ...);
使用時,選項及其可能值會從 @myopts
中移除,全域 @ARGV
則完全不受影響。
以下兩個呼叫會產生相同的行為
$ret = GetOptions( ... );
$ret = GetOptionsFromArray(\@ARGV, ... );
這也表示第一個參數雜湊參照現在會變成第二個參數
$ret = GetOptions(\%opts, ... );
$ret = GetOptionsFromArray(\@ARGV, \%opts, ... );
特殊項目 GetOptionsFromString
可用於解析任意字串中的選項。
use Getopt::Long qw(GetOptionsFromString);
$ret = GetOptionsFromString($string, ...);
字串的內容會使用對 Text::ParseWords::shellwords
的呼叫拆分為參數。與 GetOptionsFromArray
一樣,全域 @ARGV
也不會受到影響。
在完成後,字串中可能仍有參數尚未處理。GetOptionsFromString
在以清單內容呼叫時,會傳回傳回狀態和任何剩餘參數的陣列參照
($ret, $args) = GetOptionsFromString($string, ... );
如果仍有參數,而且 GetOptionsFromString
並未以清單內容呼叫,系統會傳送訊息,而且 GetOptionsFromString
會傳回失敗。
與 GetOptionsFromArray 一樣,第一個參數雜湊參照現在會變成第二個參數。請參閱下一段。
有時,例如選項很多時,為每個選項設定個別變數會很麻煩。GetOptions() 支援一種替代機制,將選項值儲存在雜湊中。
要這麼做,必須將雜湊的參照傳遞給 GetOptions() 作為第一個參數。對於在命令列中指定的每個選項,選項值會儲存在雜湊中,而選項名稱則作為金鑰。未在命令列中實際使用的選項不會放入雜湊中,換句話說,exists($h{option})
(或 defined())可用於測試選項是否已使用。缺點是,如果程式在 use strict
下執行,而且在未先使用 exists() 或 defined() 進行測試的情況下使用 $h{option}
,系統會發出警告。
my %h = ();
GetOptions (\%h, 'length=i'); # will store in $h{length}
對於採用清單或雜湊值的選項,必須在類型後加上 @
或 %
符號來表示
GetOptions (\%h, 'colours=s@'); # will push to @{$h{colours}}
為了讓事情更複雜,雜湊可能包含實際目的地的參照,例如
my $len = 0;
my %h = ('length' => \$len);
GetOptions (\%h, 'length=i'); # will store in $len
此範例與下列範例完全相同
my $len = 0;
GetOptions ('length=i' => \$len); # will store in $len
任何混合都是可能的。例如,最常使用的選項可以儲存在變數中,而所有其他選項則儲存在雜湊中
my $verbose = 0; # frequently referred
my $debug = 0; # frequently referred
my %h = ('verbose' => \$verbose, 'debug' => \$debug);
GetOptions (\%h, 'verbose', 'debug', 'filter', 'size=i');
if ( $verbose ) { ... }
if ( exists $h{filter} ) { ... option 'filter' was specified ... }
使用組合可以一次設定多個單一字元選項。例如,如果 a
、v
和 x
都是有效選項,
-vax
將會設定所有三個選項。
Getopt::Long 支援三種組合樣式。若要啟用組合,需要呼叫 Getopt::Long::Configure。
最簡單的組合樣式可以使用下列方式啟用
Getopt::Long::Configure ("bundling");
以這種方式設定後,單一字元選項可以組合,但長選項(以及任何自動縮寫的簡短形式)必須始終以雙破折號 --
開頭,以避免混淆。例如,當 vax
、a
、v
和 x
都是有效選項時,
-vax
將會設定 a
、v
和 x
,但
--vax
將會設定 vax
。
第二種組合樣式取消此限制。可以使用下列方式啟用
Getopt::Long::Configure ("bundling_override");
現在,-vax
將會設定選項 vax
。
在以上所有情況中,選項值都可以插入組合中。例如
-h24w80
等同於
-h 24 -w 80
第三種組合樣式只允許將值與選項組合。可以使用下列方式啟用
Getopt::Long::Configure ("bundling_values");
現在,-h24
將會將選項 h
設定為 24
,但選項組合(例如 -vxa
和 -h24w80
)會標示為錯誤。
啟用 bundling_values
將會停用其他兩種組合樣式。
當設定為組合時,單一字元選項會區分大小寫,而長選項則不會區分大小寫。若要讓單一字元選項也不區分大小寫,請使用
Getopt::Long::Configure ("bundling", "ignorecase_always");
不用說,組合可能會造成相當大的混淆。
通常,命令列上的單獨破折號 -
不會被視為選項。選項處理將會終止(除非設定「permute」),而破折號將會保留在 @ARGV
中。
可以對單獨破折號取得特殊處理。這可以透過新增具有空白名稱的選項規格來達成,例如
GetOptions ('' => \$stdio);
現在,命令列上的單獨破折號將會成為合法的選項,並使用它將會設定變數 $stdio
。
一個特殊的選項「名稱」<>
可被用於指定一個子常式來處理非選項參數。當 GetOptions() 遇到一個看起來不像選項的參數時,它將立即呼叫這個子常式並傳遞一個參數給它:參數名稱。
例如
my $width = 80;
sub process { ... }
GetOptions ('width=i' => \$width, '<>' => \&process);
當套用在下列命令列時
arg1 --width=72 arg2 --width=60 arg3
這將呼叫 process("arg1")
而 $width
為 80
,呼叫 process("arg2")
而 $width
為 72
,以及呼叫 process("arg3")
而 $width
為 60
。
此功能需要組態選項 permute,請參閱區段 "組態 Getopt::Long"。
Getopt::Long 可透過呼叫子常式 Getopt::Long::Configure() 來組態。此子常式會取得一個引號字串清單,每個字串指定一個要啟用的組態選項,例如 ignore_case
。若要停用,請加上 no
或 no_
前綴,例如 no_ignore_case
。大小寫不重要。可以多次呼叫 Configure()。
或者,自版本 2.24 起,組態選項可以與 use
陳述式一起傳遞
use Getopt::Long qw(:config no_ignore_case bundling);
下列選項可用
此選項會將所有組態選項重設為其預設值。
此選項會將所有組態選項重設為其預設值,就像環境變數 POSIXLY_CORRECT 已設定一樣。
允許選項名稱縮寫為唯一。預設為啟用,除非環境變數 POSIXLY_CORRECT 已設定,在這種情況下 auto_abbrev
會停用。
允許 +
來啟動選項。預設為啟用,除非環境變數 POSIXLY_CORRECT 已設定,在這種情況下 getopt_compat
會停用。
gnu_compat
控制是否允許 --opt=
,以及它應該做什麼。沒有 gnu_compat
,--opt=
會產生錯誤。有了 gnu_compat
,--opt=
會提供選項 opt
和空值。這是 GNU getopt_long() 的執行方式。
請注意,即使 GNU getopt_long() 沒有,--opt 值
仍然被接受。
這是設定 gnu_compat
bundling
permute
no_getopt_compat
的簡短方式。有了 gnu_getopt
,命令列處理應與 GNU getopt_long() 相當相容。
命令列引數是否允許與選項混合。預設為停用,除非已設定環境變數 POSIXLY_CORRECT,在這種情況下會啟用 require_order
。
另請參閱 permute
,它是 require_order
的相反選項。
命令列引數是否允許與選項混合。預設為啟用,除非已設定環境變數 POSIXLY_CORRECT,在這種情況下會停用 permute
。請注意,permute
是 require_order
的相反選項。
如果啟用 permute
,這表示
--foo arg1 --bar arg2 arg3
等同於
--foo --bar arg1 arg2 arg3
如果指定引數回呼常式,則在 GetOptions() 成功傳回後,@ARGV
將永遠為空,因為所有選項都已處理。唯一的例外是使用 --
--foo arg1 --bar arg2 -- arg3
這將呼叫 arg1 和 arg2 的回呼常式,然後終止 GetOptions(),將 "arg3"
留存在 @ARGV
中。
如果啟用 require_order
,則在遇到第一個非選項時,選項處理會終止。
--foo arg1 --bar arg2 arg3
等同於
--foo -- arg1 --bar arg2 arg3
如果也啟用 pass_through
,則選項處理會在第一個無法辨識的選項或非選項(以先遇到的為準)終止。
啟用此選項將允許組合單一字元選項。為了區分組合與長選項名稱,長選項(及其任何自動縮寫的簡短形式)必須以 --
開頭,而組合則以 -
開頭。
請注意,如果您有選項 a
、l
和 all
,並啟用 auto_abbrev,可能的引數和選項設定如下
using argument sets option(s)
------------------------------------------
-a, --a a
-l, --l l
-al, -la, -ala, -all,... a, l
--al, --all all
令人驚訝的是,--a
設定選項 a
(由於自動完成),而不是 all
。
注意:停用 bundling
也會停用 bundling_override
。
如果啟用 bundling_override
,則組合會像 bundling
一樣啟用,但現在長選項名稱會覆寫選項組合。
注意:停用 bundling_override
也會停用 bundling
。
注意:使用 bundling 選項很容易導致意外結果,特別是在混合長選項和組合時。買方自負。
如果已啟用,在比對選項名稱時會忽略大小寫。但是,如果 bundling 也已啟用,單字元選項將會區分大小寫。
使用 ignore_case
時,僅在大小寫不同的選項規格,例如 "foo"
和 "Foo"
,才會標示為重複。
注意:停用 ignore_case
也會停用 ignore_case_always
。
當 bundling 生效時,單字元選項也會忽略大小寫。
注意:停用 ignore_case_always
也會停用 ignore_case
。
如果應用程式本身未指定此選項的處理常式,則自動提供對 --version 選項的支援。
Getopt::Long 會提供標準版本訊息,其中包含程式名稱、其版本(如果已定義 $main::VERSION)以及 Getopt::Long 和 Perl 的版本。訊息會寫入標準輸出,而且處理作業會終止。
如果呼叫程式在 use
或 require
陳述式中明確指定高於 2.32 的版本號碼,則會啟用 auto_version
。
如果應用程式本身未指定此選項的處理常式,則自動提供對 --help 和 -? 選項的支援。
Getopt::Long 會使用模組 Pod::Usage 提供說明訊息。訊息會從 SYNOPSIS POD 區段衍生,而且會寫入標準輸出,而且處理作業會終止。
如果呼叫程式在 use
或 require
陳述式中明確指定高於 2.32 的版本號碼,則會啟用 auto_help
。
使用 pass_through
,任何未知、含糊或提供無效選項的項目都不會標示為錯誤。相反地,未知選項將傳遞至 catchall <>
(若有),否則傳遞至 @ARGV
。這使得撰寫只處理使用者提供的命令列參數一部分的包裝腳本,並將剩餘選項傳遞至其他程式成為可能。
如果啟用 require_order
,選項處理會在第一個無法辨識的選項或非選項(以先出現者為準)終止,且所有剩餘引數會傳遞至 @ARGV
,而不是 catchall <>
(若有)。不過,如果啟用 permute
,結果可能會令人困惑。
請注意,選項終止符(預設為 --
),若有,也會在 @ARGV
中傳遞。
啟動選項的字串。如果常數字串不足夠,請參閱 prefix_pattern
。
識別引發選項的字串的 Perl 模式。預設為 --|-|\+
,除非已設定環境變數 POSIXLY_CORRECT,否則為 --|-
。
允許區分長前綴和短前綴的 Perl 模式。預設為 --
。
通常,只有在使用非標準前綴,且希望部分或全部前綴具有與 '--' 在正常情況下相同的語意時,才需要設定這個值。
例如,將 prefix_pattern 設定為 --|-|\+|\/
,並將 long_prefix_pattern 設定為 --|\/
,會新增 Win32 風格的引數處理。
啟用偵錯輸出。
這個子常式提供標準版本訊息。其引數可以是
包含訊息文字的字串,用於印出標準訊息之前。
對應於所需結束狀態的數字值。
雜湊的參考。
如果給定多個參數,則假設整個參數清單為雜湊。如果提供雜湊(作為參考或清單),它應包含一個或多個具有下列金鑰的元素
-message
-msg
在列印程式使用說明訊息之前立即列印的訊息文字。
-exitval
傳遞給 exit() 函式的所需結束狀態。這應為整數,或字串 "NOEXIT",以表示應僅傳回控制權,而不終止呼叫處理程序。
-output
檔案控制代碼的參考,或應將使用說明訊息寫入其中的檔案路徑。預設為 \*STDERR
,除非結束值小於 2(這種情況下預設為 \*STDOUT
)。
您無法將此常式直接繫結到選項,例如
GetOptions("version" => \&VersionMessage);
改用此方法
GetOptions("version" => sub { VersionMessage() });
此子常式產生標準的說明訊息,使用 Pod::Usage 從程式的 POD 區段 SYNOPSIS 衍生而來。它採用與 VersionMessage() 相同的參數。特別是,您無法將它直接繫結到選項,例如
GetOptions("help" => \&HelpMessage);
改用此方法
GetOptions("help" => sub { HelpMessage() });
組態錯誤和選項定義中的錯誤會使用 die() 訊號傳送,並會終止呼叫程式,除非 Getopt::Long::GetOptions() 的呼叫已內嵌在 eval { ... }
中,或使用 $SIG{__DIE__}
攔截 die()。
GetOptions 傳回 true 以表示成功。當函式在選項剖析期間偵測到一個或多個錯誤時,它會傳回 false。這些錯誤會使用 warn() 訊號傳送,並可以使用 $SIG{__WARN__}
攔截。
newgetopt.pl
最早的開發始於 1990 年,使用 Perl 版本 4。因此,它的開發以及 Getopt::Long 的開發經歷了幾個階段。由於向後相容性一直非常重要,因此目前版本的 Getopt::Long 仍支援許多現今不再必要或不受歡迎的建構。本節簡要說明其中一些「功能」。
當未為選項指定目的地時,GetOptions 會將結果值儲存在名為 opt_
XXX 的全域變數中,其中 XXX 是此選項的主要名稱。當程式在 use strict
(建議)下執行時,這些變數必須使用 our() 或 use vars
預先宣告。
our $opt_length = 0;
GetOptions ('length=i'); # will store in $opt_length
若要產生可用的 Perl 變數,不屬於變數語法的字元會轉換成底線。例如,--fpp-struct-return
會設定變數 $opt_fpp_struct_return
。請注意,這個變數存在於呼叫程式的命名空間中,不一定會是 main
。例如
GetOptions ("size=i", "sizes=i@");
使用命令列「-size 10 -sizes 24 -sizes 48」會執行等同於以下指定
$opt_size = 10;
@opt_sizes = (24, 48);
字串的其他選項起始字元可能會傳遞為第一個引數(或在開頭雜湊參考引數之後的第一個引數)。
my $len = 0;
GetOptions ('/', 'length=i' => $len);
現在命令列可能會看起來像
/length 24 -- arg
請注意,若要終止選項處理,仍然需要雙破折號 --
。
如果下一個引數是參考,GetOptions() 就不會將開頭的 "<>"
解釋為選項起始字元。若要強制將 "<"
和 ">"
作為選項起始字元,請使用 "><"
。很混淆嗎?嗯,強烈建議不要使用起始引數。
先前版本的 Getopt::Long 使用變數來進行組態。雖然操作這些變數仍然有效,但強烈建議使用版本 2.17 中引入的 Configure
常式。此外,這容易多了。
有時您會想要結合雜湊和陣列的優點。例如,命令列
--list add=first --list add=second --list add=third
其中每個連續的「list add」選項會將 add 的值推入陣列參考 $list->{'add'}。結果會像
$list->{add} = [qw(first second third)];
這可以使用目的地常式來完成
GetOptions('list=s%' =>
sub { push(@{$list{$_[1]}}, $_[2]) });
這就是為什麼它們被稱為「選項」。
命令列不是由 GetOptions 分割,而是由命令列直譯器 (CLI) 分割。在 Unix 上,這是 shell。在 Windows 上,這是 COMMAND.COM 或 CMD.EXE。其他作業系統有其他 CLI。
重要的是要知道,當命令列包含特殊字元(特別是引號或反斜線)時,這些 CLI 的行為可能不同。例如,在 Unix shell 中,您可以使用單引號 ('
) 和雙引號 ("
) 將字詞組合在一起。下列替代方案在 Unix 上是等效的
"two words"
'two words'
two\ words
如有疑問,請在 Perl 程式前面插入下列陳述式
print STDERR (join("|",@ARGV),"\n");
以驗證 CLI 如何將引數傳遞給程式。
您正在執行 Windows,並且您寫了
use GetOpt::Long;
(注意大寫的「O」)?
您只能使用別名來取得此選項,而且 Getopt::Long 的版本至少為 2.13。
use Getopt::Long;
GetOptions ("help|?"); # -help and -? will both set $opt_help
其他無法出現在 Perl 識別碼中的字元也支援在版本 2.39 的 Getopt::Long 中使用別名。請注意,字元 !
、|
、+
、=
和 :
只能出現在別名的第一個(或唯一一個)字元。
從版本 2.32 開始,Getopt::Long 提供自動說明,這是一種快速且簡單的方式,可以將選項 --help 和 -? 加入您的程式,並處理它們。
請參閱「設定 Getopt::Long」區段中的 auto_help
。
Johan Vromans <jvromans@squirrel.nl>
此程式之著作權為 Johan Vromans 所有,1990 年至 2015 年。此程式為自由軟體;您可以在 Perl Artistic License 或 GNU General Public License(由 Free Software Foundation 發布)的條款下重新散布或修改它;不論是許可證的版本 2 或(由您選擇)任何後續版本。
散布此程式的目的是希望它能對您有所幫助,但「不提供任何保證」;甚至沒有暗示的商品保證或適用於特定目的的保證。請參閱 GNU General Public License 以取得更多詳細資訊。
如果您沒有 GNU General Public License 的副本,請寫信至 Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA。