我正在更新使用Getopt::Long中的GetOptions
的现有Perl脚本。我想添加一个以字符串作为参数的选项,并且只能有3个值中的一个:small,medium或large。如果指定了任何其他字符串值,有没有办法让Perl抛出错误或终止脚本?到目前为止,我有:
my $value = 'small';
GetOptions('size=s' => \$value);
答案 0 :(得分:3)
您可以使用子例程来处理该选项的处理。 User-defined subroutines to handle options
my $size = 'small'; # default
GetOptions('size=s' => \&size);
print "$size\n";
sub size {
my %sizes = (
small => 1,
medium => 1,
large => 1
);
if (! exists $sizes{$_[1]}) {
# die "$_[1] is not a valid size\n";
# Changing it to use an exit statement works as expected
print "$_[1] is not a valid size\n";
exit;
}
$size = $_[1];
}
我将大小放入哈希值,但你可以使用数组和grep作为工具显示。
答案 1 :(得分:1)
一种方法是使用grep检查值是否合法:
use warnings;
use strict;
use Getopt::Long;
my $value = 'small';
GetOptions('size=s' => \$value);
my @legals = qw(small medium large);
die "Error: must specify one of @legals" unless grep { $_ eq $value } @legals;
print "$value\n";
答案 2 :(得分:1)
这只是GetOptions
返回后您需要执行的几项检查之一。
GetOptions
是否成功。@ARGV
。@ARGV
。以下是我执行这些检查的方式:
use Getopt::Long qw( );
my %sizes = map { $_ => 1 } qw( small medium large );
my $opt_size;
sub parse_args {
Getopt::Long::Configure(qw( :posix_default ));
$opt_size = undef;
Getopt::Long::GetOptions(
'help|h|?' => \&exit_with_usage,
'size=s' => \$opt_size,
)
or exit_bad_usage();
exit_bad_usage("Invalid size.\n")
if defined($size) && !$sizes{$size};
exit_bad_usage("Invalid number of arguments.\n")
if @ARGV;
}
以下是我处理失败的方法:
use File::Basename qw( basename );
sub exit_with_usage {
my $prog = basename($0);
print("usage: $prog [options]\n");
print(" $prog --help\n");
print("\n");
print("Options:");
print(" --size {small|medium|large}\n");
print(" Controls the size of ...\n"
exit(0);
}
sub exit_bad_usage {
my $prog = basename($0);
warn(@_) if @_;
die("Use $prog --help for help\n");
exit(1);
}
答案 3 :(得分:0)
这可能有点矫枉过正,但也要看看Getopt::Again,它通过process
configuration value每个命令行参数实现验证。
use strict;
use warnings;
use Getopt::Again;
opt_add my_opt => (
type => 'string',
default => 'small',
process => qr/^(?:small|medium|large)$/,
description => "My option ...",
);
my (%opts, @args) = opt_parse(@ARGV);
答案 4 :(得分:0)
Getopt :: Long的替代方法是Getopt::Declare
,它内置了模式支持,但稍微冗长一点:
x.value
测试运行:
use strict;
use warnings;
use feature qw/say/;
use Getopt::Declare;
my $args = Getopt::Declare->new(
join "\n",
'[strict]',
"-size <s:/small|medium|large/>\t small, medium, or large [required]"
) or exit(1);
say $args->{-size};