Как getopt :: long работает с ntermixed параметрами long / short? - PullRequest
1 голос
/ 12 февраля 2020

В описании Getopt говорится, что и '-', и '-' принимаются для одной и той же опции, и что короткие опции могут быть связаны. Предполагая, что «помощь» является опцией, тогда:

script --help     # succeeds
script --h        # succeeds
script -h         # fails

Если у нас есть две или более опций с уникальными первыми символами («ab», «cd»), -a c не работает, но - -а и - 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", так и "- час". С дублированными опциями, кажется, все работает как положено, но мое чтение описания getopt, похоже, говорит о том, что повторный код не нужен.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

С bundling, -- необходимо использовать для длинной опции. - может использоваться только для коротких опций, из которых вы не определили ничего.

Вы можете отключить связывание (nobundling после gnu_getopt вместо bundling, который уже включен gnu_getopt) .

use Getopt::Long qw( );

for (
   [qw( --help )],
   [qw( --h )],
   [qw( -h )],
) {
   @ARGV = @$_;
   say "@ARGV";

   Getopt::Long::Configure(qw( gnu_getopt nobundling auto_abbrev ignore_case_always ));
   Getopt::Long::GetOptions(
      'normalize' => \my $normalize,
      'exclude=s' => \my @exclude,
      'help'      => \my $help,
      'include=s' => \my @include,
      'recurse'   => \my $recurse,
      'update'    => \my $update,
      '2update'   => \my $update2,
      'copy'      => \my $copy,
      'move'      => \my $move,
   );

   say $help // "[undef]";
}

Или вы можете использовать help|h, определяя длинную (--) и короткую (-) опцию в одном go.

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
0 голосов
/ 12 февраля 2020
GetOptions(
    'path|p=s'  => \$opt{path},
    'help|h'    => \$opt{help},
    'man|m'     => \$opt{man},
    'debug|d'   => \$opt{debug}
) or pod2usage(2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...