内容

名称

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 模块实现了一个名为 GetOptions() 的扩展 getopt 函数。它从 @ARGV 中解析命令行,识别并删除指定的选项及其可能的值。

此函数遵循命令行选项的 POSIX 语法,并带有 GNU 扩展。通常,这意味着选项具有长名称而不是单个字母,并且以双破折号“--”开头。支持命令行选项的捆绑,就像更传统的单字母方法一样,但默认情况下未启用。

命令行选项简介

命令行操作程序传统上从命令行获取其参数,例如程序需要了解的文件名或其他信息。除了参数之外,这些程序通常还会采用命令行选项。选项不是程序工作所必需的,因此得名“选项”,但用于修改其默认行为。例如,一个程序可以安静地完成其工作,但通过一个合适的选项,它可以提供有关其所做工作的详细的信息。

命令行选项有几种类型。从历史上看,它们以一个单破折号 - 开头,并由一个字母组成。

-l -a -c

通常,这些单字符选项可以捆绑

-lac

选项可以有值,值放在选项字符之后。有时在两者之间有空格,有时没有

-s 24 -s24

由于这些选项非常隐晦,因此开发了另一种使用长名称的样式。因此,可以不使用隐晦的 -l 而使用更具描述性的 --long。为了区分一组单字符选项和一个长选项,使用两个破折号作为选项名称的前缀。早期实现的长选项使用加号 + 代替。此外,选项值可以指定如下

--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,它将通过将 $verbose 的值设置为 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 或未定义)。

如果选项目标不是标量,将忽略 + 说明符。

= type [ desttype ] [ repeat ]

该选项需要给定类型的参数。支持的类型为

s

字符串。任意字符序列。参数以 --- 开头是有效的。

i

整数。可选的前导加号或减号,后跟一系列数字。

o

扩展整数,Perl 风格。这可以是可选的前导加号或减号,后跟一系列数字,或八进制字符串(零,可选地后跟 '0'、'1'、.. '7'),或十六进制字符串(0x 后跟 '0' .. '9'、'a' .. 'f',不区分大小写),或二进制字符串(0b 后跟一系列 '0' 和 '1')。

f

实数。例如 3.14-6.23E24 等。

desttype 可以是 @%,以指定该选项是列表或哈希值。仅当选项值的目的地未另行指定时才需要这样做。不需要时应省略它。

repeat 指定该选项在命令行中每次出现时获取的值的数量。它的格式为 { [ min ] [ , [ max ] ] }

min 表示最少参数数。对于带有 = 的选项,它默认为 1,对于带有 : 的选项,它默认为 0,请参见下文。请注意,min 覆盖了 = / : 语义。

max 表示最大参数数。它必须至少为 min。如果省略 max但保留逗号,则获取的参数值数量没有上限。

: type [ desttype ]

= 类似,但将参数指定为可选。如果省略,将为字符串值选项分配一个空字符串,为数字选项分配值零。

请注意,如果字符串参数以 --- 开头,它将被视为一个选项本身。

: number [ desttype ]

类似于 :i,但如果省略值,则将分配 number

如果 number 是八进制、十六进制或二进制,则表现为 :o

: + [ desttype ]

类似于 :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 版本中,回调函数的第一个参数已从字符串更改为对象。这样做是为了扩展和更详细的控制。对象字符串化到选项名称,因此此更改不应引入兼容性问题。

回调对象具有以下方法

name

选项的名称,未缩写。对于具有多个名称的选项,它返回第一个(规范)名称。

given

选项的名称,实际使用时未缩写。

线程安全性

从 Perl 5.8 开始,在使用 ithreads 时,Getopt::Long 是线程安全的。在使用添加到 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 下运行并使用 $h{option} 而未首先使用 exists() 或 defined() 进行测试,则会发出警告。

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

这将在 $width80 时调用 process("arg1"),在 $width72 时调用 process("arg2"),在 $width60 时调用 process("arg3")

此功能需要配置选项 permute,请参阅部分 "配置 Getopt::Long"

配置 Getopt::Long

可以通过调用子例程 Getopt::Long::Configure() 来配置 Getopt::Long。此子例程采用一个引号字符串列表,每个字符串指定一个要启用的配置选项,例如 ignore_case。要禁用,请使用 nono_ 前缀,例如 no_ignore_case。大小写无关紧要。可以多次调用 Configure()。

或者,从版本 2.24 开始,配置选项可以与 use 语句一起传递

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

以下选项可用

默认

此选项将导致所有配置选项重置为其默认值。

posix_默认

此选项将导致所有配置选项重置为其默认值,就像设置了环境变量 POSIXLY_CORRECT 一样。

自动缩写

允许选项名称缩写为唯一名称。默认情况下启用,除非已设置环境变量 POSIXLY_CORRECT,在这种情况下,auto_abbrev 将被禁用。

getopt_兼容

允许 + 开头选项。默认情况下启用,除非已设置环境变量 POSIXLY_CORRECT,在这种情况下,getopt_compat 将被禁用。

gnu_兼容

gnu_compat 控制是否允许 --opt=,以及它应该做什么。如果没有 gnu_compat--opt= 会给出一个错误。使用 gnu_compat--opt= 将给出选项 opt 和空值。这是 GNU getopt_long() 的处理方式。

请注意,--opt value 仍然被接受,即使 GNU getopt_long() 不接受。

gnu_getopt

这是设置 gnu_compat bundling permute no_getopt_compat 的一种简便方法。使用 gnu_getopt,命令行处理应该与 GNU getopt_long() 相当兼容。

要求顺序

是否允许将命令行参数与选项混合。默认情况下禁用,除非已设置环境变量 POSIXLY_CORRECT,在这种情况下,require_order 将被启用。

另请参见 permute,它是 require_order 的相反项。

置换

是否允许将命令行参数与选项混合。默认情况下启用,除非已设置环境变量 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 (default: disabled)

启用此选项将允许捆绑单字符选项。为了将捆绑与长选项名称区分开来,长选项(及其任何自动缩写的简短形式)必须-- 开头,而捆绑以 - 开头。

请注意,如果您有选项 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 (default: disabled)

如果启用了 bundling_override,则 bundling 将与 bundling 一起启用,但现在长选项名称将覆盖选项捆绑。

注意:禁用 bundling_override 也将禁用 bundling

注意:使用选项捆绑很容易导致意外结果,尤其是在混合使用长选项和捆绑时。买者自负。

ignore_case (default: enabled)

如果启用,则在匹配选项名称时忽略大小写。但是,如果同时启用了捆绑,则单字符选项将区分大小写。

使用 ignore_case,对于仅在大小写上有区别的选项(例如,"foo""Foo")的选项规范将被标记为重复项。

注意:禁用 ignore_case 也将禁用 ignore_case_always

ignore_case_always (default: disabled)

当捆绑生效时,单字符选项也将忽略大小写。

注意:禁用 ignore_case_always 也将禁用 ignore_case

auto_version (default:disabled)

如果应用程序本身未为此选项指定处理程序,则自动为 --version 选项提供支持。

Getopt::Long 将提供标准版本消息,其中包括程序名称、版本(如果定义了 $main::VERSION),以及 Getopt::Long 和 Perl 的版本。消息将写入标准输出,并且处理将终止。

如果调用程序在 userequire 语句中明确指定了高于 2.32 的版本号,则将启用 auto_version

auto_help (default:disabled)

如果应用程序未为此选项指定处理程序,则自动为 --help-? 选项提供支持。

Getopt::Long 将使用模块 Pod::Usage 提供帮助消息。从 SYNOPSIS POD 部分派生的消息将写入标准输出,并且处理将终止。

如果调用程序在 userequire 语句中明确指定了高于 2.32 的版本号,则将启用 auto_help

pass_through (default: disabled)

使用 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 中?

您只能使用别名和至少为 2.13 版本的 Getopt::Long 来获取此选项。

use Getopt::Long;
GetOptions ("help|?");    # -help and -? will both set $opt_help

在版本 2.39 的 Getopt::Long 中,别名中还支持其他不能出现在 Perl 标识符中的字符。请注意,字符 !|+=: 只能作为别名的第一个(或唯一)字符出现。

从版本 2.32 开始,Getopt::Long 提供自动帮助,这是一种快速简便的方法,可将选项 --help 和 -? 添加到您的程序并处理它们。

请参阅“配置 Getopt::Long”部分中的 auto_help

作者

Johan Vromans <[email protected]>

版权和免责声明

此程序的版权为 1990、2015 年,所有者为 Johan Vromans。此程序是免费软件;您可以根据 Perl 艺术许可证或自由软件基金会发布的 GNU 通用公共许可证(许可证的第 2 版或(由您选择)任何更高版本)重新分发或修改它;

希望此程序对您有所帮助,但它不提供任何保证;甚至不提供有关适销性或针对特定用途的适用性的默示保证。有关更多详细信息,请参阅 GNU 通用公共许可证。

如果您没有 GNU 通用公共许可证副本,请写信至美国马萨诸塞州剑桥市马萨韦 675 号,自由软件基金会,邮编 02139。