强制使用标志 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'.
您可以添加条件来检查标志的值,如果它们未定义则调用 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");
有没有办法在使用 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'.
您可以添加条件来检查标志的值,如果它们未定义则调用 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");