强制使用标志Getopt :: Long

时间:2016-09-07 12:52:00

标签: perl getopt-long

有没有办法在使用Getopt :: Long读取命令行参数时强制使用-flags?例如,在我目前的情况下:

GetOptions('r=s' => \$var1,
              'lf=f' => \$var2,
              'uf=f' => \$var3,
              'trd=i' => \$var4,
              'vd=f' => \$var5)
or die("$usage");

如果仍然提供参数但没有标志(例如-lf),则脚本不会退出或显示$ usage。相反,它会运行,直到它后来不可避免地出现错误,因为参数没有被读入它们各自的变量(并且可能是错误的顺序)。

3 个答案:

答案 0 :(得分:4)

  

问:当未提供选项时,GetOptions不会返回错误结果

     

答:这就是为什么他们被称为'选项'。

来源:Getopt::Long documentation

您可以添加条件以检查标记的值,如果未定义,则调用die或调用usage

答案 1 :(得分:1)

Getopt::Long将搜索您在GetOptions调用中指定的所有命令行选项。它们都不是必需的,但可能需要单个选项才能具有特定类型的值,如果值丢失或类型错误,GetOptions将返回 false 状态

从命令行中删除任何选项及其值,剩下的任何内容都会照常通过@ARGV传递给程序

大多数程序不需要在命令行上提供所有可能的选项,因此如果您想要坚持指定所有选项,那么您只需使用

进行测试即可。
use List::Util 'all';

die $usage unless all { defined } $var1, $var2, $var3, $var4, $var5;

您可能还想要求没有未指定为其中一个选项的输入,在这种情况下,您只需检查@ARGV

die $usage if @ARGV;

答案 2 :(得分:0)

事后检查。

use File::Basename qw( basename );

sub help {
    print(...);
    exit(0);
}

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

   my $prog_name = basename($0);

   warn("Use $prog_name --help for more information\n");
   exit(1);
}

my ($var1, $var2, $var3, $var4, $var5);

GetOptions(
   'help|h|?' => \&help,
   'r=s'      => \$var1,
   'lf=f'     => \$var2,
   'uf=f'     => \$var3,
   'trd=i'    => \$var4,
   'vd=f'     => \$var5
)
    or usage();

defined($var2)
   or usage("-lf must be provided");