如何检测无效选项值

whi*_*way 1 perl arguments getopt

我有一个perl脚本,可以解析以下内容:

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

但是当我进入时,我想让它出错

prog -t xyz -pab -cm xyz.cmd -co xyz.config

(因为-p后跟a和b后没有引号).我正在使用Getopt :: Long来处理cmd行args.我如何抓住上述情况并出错?

谢谢!

ike*_*ami 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();
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

$ ./prog -t xyz -p a b -cm xyz.cmd -co xyz.config
Too many arguments.
Try `prog --help' for more information.
Run Code Online (Sandbox Code Playgroud)

另外,还有一些实施help和建议usage:

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);
}
Run Code Online (Sandbox Code Playgroud)