Perl Getopts标记不带破折号的坏选项
Perl Getopts标记不带破折号的坏选项,perl,getopt,getopt-long,Perl,Getopt,Getopt Long,test.pl不带破折号的坏选项 如果在没有破折号的情况下传递错误选项,如何使getopts标记为错误?我原以为没有通行证会解决这个问题。我缺少什么?只对选项进行操作:以连字符开头的参数。如果没有passthrough(默认为no_pass_-through),它将从中删除它们,留下任何非选项参数供您处理。如果不希望有非选项参数,则如果调用GetOptions后仍有任何参数,则可以确定选项传递不正确 Getopt::Long::Configure("no_pass_through"); my %
test.pl不带破折号的坏选项
如果在没有破折号的情况下传递错误选项,如何使getopts标记为错误?我原以为没有通行证
会解决这个问题。我缺少什么?只对选项进行操作:以连字符开头的参数。如果没有passthrough(默认为no_pass_-through),它将从中删除它们,留下任何非选项参数供您处理。如果不希望有非选项参数,则如果调用GetOptions
后仍有任何参数,则可以确定选项传递不正确
Getopt::Long::Configure("no_pass_through");
my %opts = ();
GetOptions(\%opts,
'opt1=s',
'opt2=s',
'opt3'
);
GetOptions
的返回值也很有用,因为它将指示是否找到任何无法识别或无效的选项
die "Usage: $0 [--opt1=string] [--opt2=string] [--opt3]\n" if @ARGV;
选项用前导破折号(连字符)表示;争论并非如此 您可能会发现: 特殊选项“name”可用于指定子例程来处理非选项参数。当GetOptions()遇到一个看起来不像选项的参数时,它将立即调用此子例程并向其传递一个参数:参数名称
Long只是提取选项。由您来验证这些选项和非选项参数的值(保留在
@ARGV
中)
具体来说,如果您想确保只传递了选项,那么可以使用
GetOptions(...) or die "Usage: $0 ...\n";
我使用的是:
@ARGV == 0
or die("usage\n");
助手:
use Getopt::Long qw( );
my ( $opt_opt1, $opt_opt2, $opt_opt3 );
sub parse_args {
( $opt_opt1, $opt_opt2, $opt_opt3 ) = ();
Getopt::Long::Configure(qw( posix_default ));
Getopt::Long::GetOptions(
'help|h|?' => \&help,
'opt1=s' => \$opt_opt1,
'opt2=s' => \$opt_opt2,
'opt3' => \$opt_opt3,
)
or usage();
# Validate $opt_* here if necessary.
!@ARGV
or usage("Too many arguments.");
return @ARGV;
}
sub main {
# my () = @_; # This program doesn't accept non-option args.
...
}
main(parse_args());
查看文档,注意描述部分的第一段——你们会发现你们缺少了什么。为什么这个健全性检查不是实现的一部分?i、 e如果
Getopt::Long::Configure(“无杂散选项”),则不允许杂散选项代码>没有“迷失”选项。不属于选项的第一个值(包括--
之后的第一个值)和所有后续值都是程序的参数。GetOptions无法知道您的程序接受了多少个参数,添加一个机制来告诉它也没有意义,因为这将比自己进行检查更加复杂(因为有些程序需要固定数量的参数,而有些程序需要封闭范围,而有些程序需要开放范围)。我写的是“由你选择”,而不是“由你决定”。(固定)
use File::Basename qw( basename );
sub help {
my $prog = basename($0);
print
"Usage:
$prog [options]
$prog --help
Options:
--opt1 FOO
...
--opt2 BAR
...
--opt3
...
";
exit(0);
}
sub usage {
if (@_) {
my ($msg) = @_;
chomp($msg);
say STDERR $msg;
}
my $prog = basename($0);
say STDERR "Try '$prog --help' for more information.";
exit(1);
}