Perl getopt::long如何使用长/短混合选项?

Perl getopt::long如何使用长/短混合选项?,perl,Perl,Getopt描述表示同一个选项接受“-”和“--”,短选项可以捆绑。假设“帮助”是一个选项,那么: script --help # succeeds script --h # succeeds script -h # fails 如果我们有两个或多个具有唯一第一个字符(“ab”、“cd”)的选项,-ac不起作用,但是--a和--c起作用。我已经看过了所有的getopt选项,我认为它们使用得很正确。我是否缺少一个选项,或者我是否误解了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