Getopts, чтобы пометить плохие варианты без черты - PullRequest
1 голос
/ 07 февраля 2020
Getopt::Long::Configure("no_pass_through");
my %opts = ();
GetOptions(\%opts,
           'opt1=s',
           'opt2=s',
           'opt3'
          );

test.pl bad_option_without_dash

Как сделать так, чтобы getopts помечал ошибку, когда плохая опция передается без значения da sh? Я ожидал, что no_pass_through позаботится об этом. Чего мне не хватает?

Ответы [ 3 ]

2 голосов
/ 08 февраля 2020

Getopt :: Long просто извлекает параметры. Вы должны проверить значение этих опций и аргументов, не являющихся опциями (которые оставлены в @ARGV).

В частности, если вы хотите убедиться, что переданы только опции, то вы можно использовать

@ARGV == 0
   or die("usage\n");

Что я использую:

use Getopt::Long qw( );

my ( $opt_opt1, $opt_opt2, $opt_opt3 );

sub parse_args {
   ( $opt_opt1, $opt_opt2, $opt_opt3 ) = ();

   Getopt::Long::Configure(qw( posix_default ));
   Getopt::Long::GetOptions(
      'help|h|?' => \&help,
      'opt1=s'   => \$opt_opt1,
      'opt2=s'   => \$opt_opt2,
      'opt3'     => \$opt_opt3,
   )
      or usage();

   # Validate $opt_* here if necessary.

   !@ARGV
      or usage("Too many arguments.");

   return @ARGV;
}

sub main {
   # my () = @_;   # This program doesn't accept non-option args.
   ...
}

main(parse_args());

Помощники:

use File::Basename qw( basename );

sub help {
   my $prog = basename($0);
   print
"Usage:
  $prog [options]
  $prog --help

Options:
  --opt1 FOO
      ...

  --opt2 BAR
      ...

  --opt3
      ...
";
   exit(0);
}

sub usage {
   if (@_) {
      my ($msg) = @_;
      chomp($msg);
      say STDERR $msg;
   }

   my $prog = basename($0);
   say STDERR "Try '$prog --help' for more information.";
   exit(1);
}
1 голос
/ 07 февраля 2020

Опции обозначаются лидирующим знаком da sh (дефис); аргументов нет.

Вы можете найти Getopt :: Long Argument-callback полезно:

Специальная опция 'name' <> может использоваться для обозначения подпрограммы для обработки неопционные аргументы. Когда GetOptions () встречает аргумент, который не похож на параметр, он немедленно вызывает эту подпрограмму и передает ей один параметр: имя аргумента.

1 голос
/ 07 февраля 2020

Getopt :: Long работает только с опциями: аргументы начинаются с дефиса. Без passthrough (по умолчанию no_pass_through) он удалит их из @ ARGV , оставляя любые необязательные аргументы для обработки. Если вы не ожидали аргументов, не являющихся опциями, вы можете определить, что опции были переданы неправильно, если после вызова GetOptions.

die "Usage: $0 [--opt1=string] [--opt2=string] [--opt3]\n" if @ARGV;

остаются какие-либо аргументы. Возвращаемое значение GetOptions также полезно, так как укажите, были ли найдены какие-либо нераспознанные или недействительные параметры.

GetOptions(...) or die "Usage: $0 ...\n";
...