如何检测无效选项值

时间:2017-07-24 20:53:25

标签: perl arguments getopt

我有一个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行args。如何捕捉上述情况并输出错误?

谢谢!

1 个答案:

答案 0 :(得分:7)

您可以简单地检查一下是否留下了非选项。

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);
}