验证命令行参数

时间:2014-08-06 20:17:50

标签: perl

我的QA家伙在我的一个脚本中发现了一个问题,如果他只是将脚本垃圾作为命令选项,我的脚本仍会运行 - 但不输出任何内容。例如,如果您执行 perl my_script.pl asdf ,则不会打印使用情况消息。我想知道除了示例代码底部的 for 循环之外是否还有其他办法。

use strict;
use warnings;
use File::Basename;
use Getopt::Long;
use Data::Dumper;


my $help         = 0;
my $debug        = 0;

my $valid_options = GetOptions(
    'help'           => \$help,
    'debug'          => \$debug,
);

my $file_name = File::Basename::basename($0);
my $usage     = <<"USAGE";
USAGE: perl $file_name [ --help ] [ --debug ]

General Options:
  --help           Displays this help message
  --debug          Show Verbose Debugging Information
USAGE


if ( !$valid_options || $help ) {
    print STDERR $usage;
    exit(1);
}

for my $arg ( @ARGV ) {
    if ( !grep { $_ eq $arg } $valid_options ) {
        print STDERR $usage;
    }
}

2 个答案:

答案 0 :(得分:3)

GetOptions函数将在失败时返回false,您可以使用$valid_options正确检查。

它还会删除它识别的@ARGV中的任何值,因此您实际上不必迭代剩余的参数数组,只需检查它是否包含任何值。

这很有用,因为它经常需要将文件名传递给脚本,因此无论顺序如何,只需要在调用@ARGV之后移出GetOptions的第一个元素参数传递给脚本。

因此,以下显示了您建议的工作脚本的简化。

use strict;
use warnings;

use File::Basename;
use Getopt::Long;
use Data::Dumper;

my $valid_options = GetOptions(
    'help'           => \(my $help  = 0),
    'debug'          => \(my $debug = 0),
);

my $file_name = File::Basename::basename($0);
my $usage     = <<"END_USAGE";
USAGE: perl $file_name [ --help ] [ --debug ]

General Options:
  --help           Displays this help message
  --debug          Show Verbose Debugging Information
END_USAGE

die $usage if !$valid_options || $help;

die "Invalid parameter: @ARGV\n$usage" if @ARGV;

答案 1 :(得分:1)

你的脚本适合我...

$ ./my_script.pl 
$ ./my_script.pl garbage
USAGE: perl my_script.pl [ --help ] [ --debug ]

General Options:
  --help           Displays this help message
  --debug          Show Verbose Debugging Information
$ ./my_script.pl --help
USAGE: perl my_script.pl [ --help ] [ --debug ]

General Options:
  --help           Displays this help message
  --debug          Show Verbose Debugging Information
$ ./my_script.pl --debug
$ ./my_script.pl --debug garbage
USAGE: perl my_script.pl [ --help ] [ --debug ]

General Options:
  --help           Displays this help message
  --debug          Show Verbose Debugging Information