perl GetOptions检查选项值

7gcisfzg  于 2022-11-15  发布在  Perl
关注(0)|答案(5)|浏览(209)

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

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

nle07wnf1#

您可以使用子例程来处理该选项的处理。

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,如toolic所示。

x8diyxa7

x8diyxa72#

一种方法是使用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";
jogvjijk

jogvjijk3#

这只是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);
}
6pp0gazn

6pp0gazn4#

这可能有点过头了,但也可以看看Getopt::Again,它通过每个命令行参数的process配置值实现验证。

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

gstyhher5#

Getopt::Long的替代方法是Getopt::Declare,它具有内置的模式支持,但稍微详细一些:

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

测试回合:

[hmcmillen]$ perl test.pl -size small
small
[hmcmillen]$ perl test.pl -size medium
medium
[hmcmillen]$ perl test.pl -size large
large
[hmcmillen]$ perl test.pl -size extra-large
Error: incorrect specification of '-size' parameter
Error: required parameter -size not found.
Error: unrecognizable argument ('extra-large')

(try 'test.pl -help' for more information)

相关问题