有没有办法在使用Getopt :: Long读取命令行参数时强制使用-flags?例如,在我目前的情况下:
GetOptions('r=s' => \$var1,
'lf=f' => \$var2,
'uf=f' => \$var3,
'trd=i' => \$var4,
'vd=f' => \$var5)
or die("$usage");
如果仍然提供参数但没有标志(例如-lf),则脚本不会退出或显示$ usage。相反,它会运行,直到它后来不可避免地出现错误,因为参数没有被读入它们各自的变量(并且可能是错误的顺序)。
答案 0 :(得分:4)
问:当未提供选项时,GetOptions不会返回错误结果
答:这就是为什么他们被称为'选项'。
您可以添加条件以检查标记的值,如果未定义,则调用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");