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