目錄

名稱

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

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 或未定義)。

如果選項目的地不是純量,則會忽略 + 指定符。

= 類型 [ 目的地類型 ] [ 重複 ]

選項需要指定類型參數。支援的類型為

s

字串。任意字元序列。參數以 --- 開頭是有效的。

i

整數。可選擇加上正號或負號,後接一連串數字。

o

延伸整數,Perl 風格。這可以是可選擇加上正號或負號,後接一連串數字,或八進位字串(零,可選擇後接「0」、「1」...「7」),或十六進位字串(0x 後接「0」...「9」、「a」...「f」,不分大小寫),或二進位字串(0b 後接一連串「0」和「1」)。

f

實數。例如 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 ... }

組合

使用組合可以一次設定多個單一字元選項。例如,如果 avx 都是有效選項,

-vax

將會設定所有三個選項。

Getopt::Long 支援三種組合樣式。若要啟用組合,需要呼叫 Getopt::Long::Configure。

最簡單的組合樣式可以使用下列方式啟用

Getopt::Long::Configure ("bundling");

以這種方式設定後,單一字元選項可以組合,但長選項(以及任何自動縮寫的簡短形式)必須始終以雙破折號 -- 開頭,以避免混淆。例如,當 vaxavx 都是有效選項時,

-vax

將會設定 avx,但

--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")$width80,呼叫 process("arg2")$width72,以及呼叫 process("arg3")$width60

此功能需要組態選項 permute,請參閱區段 "組態 Getopt::Long"

組態 Getopt::Long

Getopt::Long 可透過呼叫子常式 Getopt::Long::Configure() 來組態。此子常式會取得一個引號字串清單,每個字串指定一個要啟用的組態選項,例如 ignore_case。若要停用,請加上 nono_ 前綴,例如 no_ignore_case。大小寫不重要。可以多次呼叫 Configure()。

或者,自版本 2.24 起,組態選項可以與 use 陳述式一起傳遞

use Getopt::Long qw(:config no_ignore_case bundling);

下列選項可用

default

此選項會將所有組態選項重設為其預設值。

posix_default

此選項會將所有組態選項重設為其預設值,就像環境變數 POSIXLY_CORRECT 已設定一樣。

auto_abbrev

允許選項名稱縮寫為唯一。預設為啟用,除非環境變數 POSIXLY_CORRECT 已設定,在這種情況下 auto_abbrev 會停用。

getopt_compat

允許 + 來啟動選項。預設為啟用,除非環境變數 POSIXLY_CORRECT 已設定,在這種情況下 getopt_compat 會停用。

gnu_compat

gnu_compat 控制是否允許 --opt=,以及它應該做什麼。沒有 gnu_compat--opt= 會產生錯誤。有了 gnu_compat--opt= 會提供選項 opt 和空值。這是 GNU getopt_long() 的執行方式。

請注意,即使 GNU getopt_long() 沒有,--opt 值 仍然被接受。

gnu_getopt

這是設定 gnu_compat bundling permute no_getopt_compat 的簡短方式。有了 gnu_getopt,命令列處理應與 GNU getopt_long() 相當相容。

require_order

命令列引數是否允許與選項混合。預設為停用,除非已設定環境變數 POSIXLY_CORRECT,在這種情況下會啟用 require_order

另請參閱 permute,它是 require_order 的相反選項。

permute

命令列引數是否允許與選項混合。預設為啟用,除非已設定環境變數 POSIXLY_CORRECT,在這種情況下會停用 permute。請注意,permuterequire_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,則選項處理會在第一個無法辨識的選項或非選項(以先遇到的為準)終止。

bundling (預設:已停用)

啟用此選項將允許組合單一字元選項。為了區分組合與長選項名稱,長選項(及其任何自動縮寫的簡短形式)必須-- 開頭,而組合則以 - 開頭。

請注意,如果您有選項 alall,並啟用 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_override,則組合會像 bundling 一樣啟用,但現在長選項名稱會覆寫選項組合。

注意:停用 bundling_override 也會停用 bundling

注意:使用 bundling 選項很容易導致意外結果,特別是在混合長選項和組合時。買方自負。

ignore_case (預設:已啟用)

如果已啟用,在比對選項名稱時會忽略大小寫。但是,如果 bundling 也已啟用,單字元選項將會區分大小寫。

使用 ignore_case 時,僅在大小寫不同的選項規格,例如 "foo""Foo",才會標示為重複。

注意:停用 ignore_case 也會停用 ignore_case_always

ignore_case_always (預設:已停用)

當 bundling 生效時,單字元選項也會忽略大小寫。

注意:停用 ignore_case_always 也會停用 ignore_case

auto_version (預設:已停用)

如果應用程式本身未指定此選項的處理常式,則自動提供對 --version 選項的支援。

Getopt::Long 會提供標準版本訊息,其中包含程式名稱、其版本(如果已定義 $main::VERSION)以及 Getopt::Long 和 Perl 的版本。訊息會寫入標準輸出,而且處理作業會終止。

如果呼叫程式在 userequire 陳述式中明確指定高於 2.32 的版本號碼,則會啟用 auto_version

auto_help (預設:已停用)

如果應用程式本身未指定此選項的處理常式,則自動提供對 --help-? 選項的支援。

Getopt::Long 會使用模組 Pod::Usage 提供說明訊息。訊息會從 SYNOPSIS POD 區段衍生,而且會寫入標準輸出,而且處理作業會終止。

如果呼叫程式在 userequire 陳述式中明確指定高於 2.32 的版本號碼,則會啟用 auto_help

pass_through(預設:已停用)

使用 pass_through,任何未知、含糊或提供無效選項的項目都不會標示為錯誤。相反地,未知選項將傳遞至 catchall <>(若有),否則傳遞至 @ARGV。這使得撰寫只處理使用者提供的命令列參數一部分的包裝腳本,並將剩餘選項傳遞至其他程式成為可能。

如果啟用 require_order,選項處理會在第一個無法辨識的選項或非選項(以先出現者為準)終止,且所有剩餘引數會傳遞至 @ARGV,而不是 catchall <>(若有)。不過,如果啟用 permute,結果可能會令人困惑。

請注意,選項終止符(預設為 --),若有,也會在 @ARGV 中傳遞。

prefix

啟動選項的字串。如果常數字串不足夠,請參閱 prefix_pattern

prefix_pattern

識別引發選項的字串的 Perl 模式。預設為 --|-|\+,除非已設定環境變數 POSIXLY_CORRECT,否則為 --|-

long_prefix_pattern

允許區分長前綴和短前綴的 Perl 模式。預設為 --

通常,只有在使用非標準前綴,且希望部分或全部前綴具有與 '--' 在正常情況下相同的語意時,才需要設定這個值。

例如,將 prefix_pattern 設定為 --|-|\+|\/,並將 long_prefix_pattern 設定為 --|\/,會新增 Win32 風格的引數處理。

debug(預設:已停用)

啟用偵錯輸出。

可匯出的方法

VersionMessage

這個子常式提供標準版本訊息。其引數可以是

  • 包含訊息文字的字串,用於印出標準訊息之前

  • 對應於所需結束狀態的數字值。

  • 雜湊的參考。

如果給定多個參數,則假設整個參數清單為雜湊。如果提供雜湊(作為參考或清單),它應包含一個或多個具有下列金鑰的元素

-message
-msg

在列印程式使用說明訊息之前立即列印的訊息文字。

-exitval

傳遞給 exit() 函式的所需結束狀態。這應為整數,或字串 "NOEXIT",以表示應僅傳回控制權,而不終止呼叫處理程序。

-output

檔案控制代碼的參考,或應將使用說明訊息寫入其中的檔案路徑。預設為 \*STDERR,除非結束值小於 2(這種情況下預設為 \*STDOUT)。

您無法將此常式直接繫結到選項,例如

GetOptions("version" => \&VersionMessage);

改用此方法

GetOptions("version" => sub { VersionMessage() });
HelpMessage

此子常式產生標準的說明訊息,使用 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 沒有傳回 false 結果

這就是為什麼它們被稱為「選項」。

GetOptions 沒有正確地分割命令列

命令列不是由 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 如何將引數傳遞給程式。

呼叫未定義的子常式 &main::GetOptions

您正在執行 Windows,並且您寫了

use GetOpt::Long;

(注意大寫的「O」)?

如何將「-?」選項放入 Getopt::Long?

您只能使用別名來取得此選項,而且 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。