【问题标题】:How to detect invalid option value如何检测无效的选项值
【发布时间】:2017-07-24 20:53:25
【问题描述】:

我有一个预期解析以下内容的 perl 脚本:

prog -t xyz -p "a b" -cm xyz.cmd -co xyz.config

但我希望它在我输入时出错

prog -t xyz -p a b -cm xyz.cmd -co xyz.config

(因为 -p 后面跟着不带引号的 a 和 b)。我正在使用 Getopt::Long 来处理 cmd 行参数。如何捕捉到上述情况并出错?

谢谢!

【问题讨论】:

  • 在您的第二个用例中,b 将被视为常规命令行参数,并将持续存在于 @ARGV 中,因此只需检查 @ARGV 是否只有一个元素?
  • 如果 ab 预计不是字符串,那么您可以使用该事实,需要整数(或浮点)输入为 -p。除此之外,在Getopt::Long 完成它的部分之后,您将在@ARGV 中有一个松散的b,您可以检查它。或者只是解析并检查-p 输入。

标签: perl arguments getopt


【解决方案1】:

你可以简单地检查一下你是否还有非选项。

use Getopt::Long qw( );

my ($opt_t, $opt_p, $opt_cm, $opt_co);

sub parse_args {
   Getopt::Long::Configure(qw( posix_default ));

   ($opt_t, $opt_p, $opt_cm, $opt_co) = ();

   Getopt::Long::GetOptions(
      'h|help|?' => \&help,
      't=s'  => \$opt_t,
      'p=s'  => \$opt_p,
      'cm=s' => \$opt_cm,
      'co=s' => \$opt_co,
   )
      or usage();

   @ARGV == 0
      or usage("Too many arguments.");
}

{
   parse_args();
   ...
}

输出(使用下面提供的usage):

$ ./prog -t xyz -p a b -cm xyz.cmd -co xyz.config
Too many arguments.
Try `prog --help' for more information.

顺便提一下helpusage的实现建议:

use File::Basename qw( basename );

sub help {
   my $prog = basename($0);
   print("$prog [options]\n");
   print("$prog --help\n");
   print("\n");
   print("Options:\n");
   ...
   exit(0);
}

sub usage {
   my $prog = basename($0);
   if (my ($msg) = @_) {
      chomp($msg);
      warn("$msg\n");
   }

   warn("Try `$prog --help' for more information.\n");
   exit(1);
}

【讨论】:

  • @ysth 我认为require_order 与这个问题无关。
  • @melpomene,这不是必需的,尽管它确实会更快地停止解析。我总是使用posix_default。 (为什么你希望你的新程序是非标准的?)
  • @ikegami 因为我机器上的其他程序(GNU utils)都不遵循严格的 POSIX 规则。
  • 谢谢。这解决了我面临的问题。最良好的祝愿。
  • 很棒的解释冠军
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2012-05-30
  • 2020-03-21
  • 1970-01-01
  • 2019-02-20
相关资源
最近更新 更多