强制使用标志 Getopt::Long

Force use of flags 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。相反,它会不顾一切地运行,直到以后不可避免地出错,因为参数没有读入它们各自的变量(并且很可能顺序错误)。

Q: GetOptions does not return a false result when an option is not supplied

A: That's why they're called 'options'.

来源:Getopt::Long documentation

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

Getopt::Long 将搜索您在 GetOptions 调用中指定的所有命令行选项。其中 None 是必需的,但可能需要单个选项具有特定类型的值,并且 GetOptions 将 return a false值缺失或类型错误时的状态

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

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

测试它们
use List::Util 'all';

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

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

die $usage if @ARGV;

事后检查一下。

use File::Basename qw( basename );

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

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

   my $prog_name = basename([=10=]);

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