Perl Getopts标记不带破折号的坏选项

Perl Getopts标记不带破折号的坏选项,perl,getopt,getopt-long,Perl,Getopt,Getopt Long,test.pl不带破折号的坏选项 如果在没有破折号的情况下传递错误选项,如何使getopts标记为错误?我原以为没有通行证会解决这个问题。我缺少什么?只对选项进行操作:以连字符开头的参数。如果没有passthrough(默认为no_pass_-through),它将从中删除它们,留下任何非选项参数供您处理。如果不希望有非选项参数,则如果调用GetOptions后仍有任何参数,则可以确定选项传递不正确 Getopt::Long::Configure("no_pass_through"); my %

test.pl不带破折号的坏选项

如果在没有破折号的情况下传递错误选项,如何使getopts标记为错误?我原以为
没有通行证
会解决这个问题。我缺少什么?

只对选项进行操作:以连字符开头的参数。如果没有passthrough(默认为no_pass_-through),它将从中删除它们,留下任何非选项参数供您处理。如果不希望有非选项参数,则如果调用
GetOptions
后仍有任何参数,则可以确定选项传递不正确

Getopt::Long::Configure("no_pass_through");
my %opts = ();
GetOptions(\%opts,
           'opt1=s',
           'opt2=s',
           'opt3'
          );
GetOptions
的返回值也很有用,因为它将指示是否找到任何无法识别或无效的选项

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

选项用前导破折号(连字符)表示;争论并非如此

您可能会发现:

特殊选项“name”可用于指定子例程来处理非选项参数。当GetOptions()遇到一个看起来不像选项的参数时,它将立即调用此子例程并向其传递一个参数:参数名称


Long只是提取选项。由您来验证这些选项和非选项参数的值(保留在
@ARGV
中)

具体来说,如果您想确保只传递了选项,那么可以使用

GetOptions(...) or die "Usage: $0 ...\n";
我使用的是:

@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());

查看文档,注意描述部分的第一段——你们会发现你们缺少了什么。为什么这个健全性检查不是实现的一部分?i、 e如果
Getopt::Long::Configure(“无杂散选项”),则不允许杂散选项没有“迷失”选项。不属于选项的第一个值(包括
--
之后的第一个值)和所有后续值都是程序的参数。GetOptions无法知道您的程序接受了多少个参数,添加一个机制来告诉它也没有意义,因为这将比自己进行检查更加复杂(因为有些程序需要固定数量的参数,而有些程序需要封闭范围,而有些程序需要开放范围)。我写的是“由你选择”,而不是“由你决定”。(固定)
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);
}