GetOptions检查选项值

时间:2015-07-22 13:58:34

标签: perl parameters options

我正在更新使用Getopt::Long中的GetOptions的现有Perl脚本。我想添加一个以字符串作为参数的选项,并且只能有3个值中的一个:small,medium或large。如果指定了任何其他字符串值,有没有办法让Perl抛出错误或终止脚本?到目前为止,我有:

my $value = 'small';
GetOptions('size=s'  => \$value);

5 个答案:

答案 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};