Perl getopt::long如何使用长/短混合选项?
Getopt描述表示同一个选项接受“-”和“--”,短选项可以捆绑。假设“帮助”是一个选项,那么:Perl getopt::long如何使用长/短混合选项?,perl,Perl,Getopt描述表示同一个选项接受“-”和“--”,短选项可以捆绑。假设“帮助”是一个选项,那么: script --help # succeeds script --h # succeeds script -h # fails 如果我们有两个或多个具有唯一第一个字符(“ab”、“cd”)的选项,-ac不起作用,但是--a和--c起作用。我已经看过了所有的getopt选项,我认为它们使用得很正确。我是否缺少一个选项,或者我是否误解了getopt描述 实际代
script --help # succeeds
script --h # succeeds
script -h # fails
如果我们有两个或多个具有唯一第一个字符(“ab”、“cd”)的选项,-ac不起作用,但是--a和--c起作用。我已经看过了所有的getopt选项,我认为它们使用得很正确。我是否缺少一个选项,或者我是否误解了getopt描述
实际代码为:
Getopt::Long::Configure ( "gnu_getopt"
, "auto_abbrev"
, "bundling"
, "ignore_case_always"
);
GetOptions ( 'normalize' => \$normalize
, 'exclude=s' => \@exclude
, 'help' => \$help
, 'include=s' => \@include
, 'recurse' => \$recurse
, 'update' => \$update
, '2update' => \$update2
, 'copy' => \$copy
, 'move' => \$move
, 'n' => \$normalize
, 'e=s' => \@exclude
, 'h' => \$help
, 'i=s' => \@include
, 'r' => \$recurse
, 'u' => \$update
, '2' => \$update2
, 'c' => \$copy
, 'm' => \$move
);
使用重复的getopts参数,可以识别“-h”和“-h”。对于重复的选项,事情似乎如预期的那样运行,但我对getopt描述的阅读似乎表明,重复的代码是不必要的。对于
捆绑
,--
必须用于长选项<代码>-只能用于您未定义的短选项
GetOptions(
'path|p=s' => \$opt{path},
'help|h' => \$opt{help},
'man|m' => \$opt{man},
'debug|d' => \$opt{debug}
) or pod2usage(2);
您可以禁用绑定(gnu getopt
之后的nobundling
,而不是gnu getopt
已经启用的bundling
)
或者您可以使用help | h
一次性定义长(--
)和短(--
)选项
use Getopt::Long qw( );
for (
[qw( --help )],
[qw( --h )],
[qw( -h )],
) {
@ARGV = @$_;
say "@ARGV";
Getopt::Long::Configure(qw( gnu_getopt auto_abbrev ignore_case_always ));
Getopt::Long::GetOptions(
'normalize|n' => \my $normalize,
'exclude|e=s' => \my @exclude,
'help|h' => \my $help,
'include|i=s' => \my @include,
'recurse|r' => \my $recurse,
'update|u' => \my $update,
'2update|2' => \my $update2,
'copy|c' => \my $copy,
'move|m' => \my $move,
);
say $help // "[undef]";
}
两个程序都输出以下内容:
--help
1
--h
1
-h
1
无法复制。。。我先声明
$help
,然后声明名为h
和help
的选项,这两个选项都设置了$help
,还有另一个短选项(v
),所有选项都按预期工作。使用--help
和--h
和-h
进行调用,以及绑定-hv
。(而且它不允许我做-help
,正如文档所述。)(为什么gnu_getopt
与其他配置一起设置,它是…?)提示:当请求帮助时,解析进一步的选项没有意义,所以调用退出的函数(使用=>\&help
)会使更多的操作变得简单sense@ikegami:谢谢。没有想到使用\@func。很好的提示。@zdim:我认为文档中确实说“-help”是有效的。这就是你的意思吗?“gnu_getopt”是“gnu_compat、bundling、permute、no_getopt_compat”的简写,所有这些都很有用。不建议使用代码型答案。请解释您的答案为什么以及如何解决此问题。@Igor F--我们在“默认配置中,选项名称可以缩写为唯一性,大小写不重要,一个破折号就足够了,即使是长选项名称。”中的文档中都有描述。这显然不起作用,因此我提出了问题。所以,所有这些都在文档中描述过,是的,但它并没有像描述的那样工作,也是真的。我可以做“getopts”(“help | h”=>\$help);”,但这和描述的不一样。极好的答案。但是文档在perldoc.perl.org/Getopt/Long.html中说,“在默认配置中,选项名可以缩写为唯一性,大小写不重要,一个破折号就足够了,即使是长选项名。”我认为文档是错误的,尽管您的答案是对的。有没有办法解决文档问题?您没有使用默认配置。启用bundling
会改变这一点,正如我所说的,正如文档所述
--help
1
--h
1
-h
1