如果在GetOptions
默认启用了标记,是否有办法关闭标记?
这就是我想要的:
-verbose 0
关闭详细程度-verbose 1
打开详细程度-verbose
打开详细程度当前代码(来自Getopt::Long):
use Getopt::Long;
my $data = "file.dat";
my $length = 24;
my $verbose = 1;
GetOptions ("length=i" => \$length, # numeric
"file=s" => \$data, # string
"verbose" => \$verbose) # flag
or die("Error in command line arguments\n");
答案 0 :(得分:1)
这可能有点过于复杂,但您可以将optional value与custom subroutine结合使用:
use strict;
use warnings;
use 5.010;
use Getopt::Long;
sub make_handler {
my $verbose = shift;
return sub {
my ($opt_name, $opt_value) = @_;
die "$opt_name must be 0 or 1" if $opt_value !~ /^(?:0|1)?$/;
if ($opt_value eq '') {
$$verbose = 1;
}
else {
$$verbose = $opt_value;
}
}
}
my $verbose = 1;
my $handler = make_handler(\$verbose);
GetOptions("verbose:s" => $handler) or die "Error in command line arguments";
say $verbose;
$ ./foo
1
$ ./foo --verbose
1
$ ./foo --verbose 0
0
$ ./foo --verbose 1
1
$ ./foo --verbose bar
verbose must be 0 or 1 at ./foo line 15.
Error in command line arguments at ./foo line 29.
请注意,我使用了一个闭包来避免全局变量,因为Getopt::Long
没有对自定义子程序的返回值做任何事情,并且不允许你传入你想要的变量集。
答案 1 :(得分:0)
这不是你描述的方式,但是documentation描述了可以忽略的选项"用感叹号指定,让你这样做:
my $verbose = 1; # default on
GetOptions ('verbose!' => \$verbose);
这允许--verbose
(将其设置为1)或--noverbose
(将其设置为0)。
答案 2 :(得分:0)
Summary of Option Specifications文档中的Getopt::Long表示您几乎使用
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long;
my $data = "file.dat";
my $length = 24;
my $verbose = 1;
GetOptions ("length=i" => \$length, # numeric
"file=s" => \$data, # string
"verbose:i" => \$verbose) # optional integer
or die("Error in command line arguments\n");
# Debugging/testing
print "Verbose = $verbose\n";
print "Options:\n";
for my $opt (@ARGV) { print " $opt\n"; }
:
表示该值是可选的,i
表示它是一个整数。
示例运行(我称之为脚本gol.pl
):
$ perl gol.pl
Verbose = 1
Options:
$ perl gol.pl --verbose 0
Verbose = 0
Options:
$ perl gol.pl --verbose=0
Verbose = 0
Options:
$ perl gol.pl --verbose 1
Verbose = 1
Options:
$ perl gol.pl --verbose gooseberry
Verbose = 0
Options:
gooseberry
$ perl gol.pl --verbose
Verbose = 0
Options:
$
顶部有一个'几乎'。正如ThisSuitIsBlackNot正确points out,当省略参数时,这会将$verbose
设置为零,这不是您想要的。
您的界面很好奇。你确定你不会更好:
--verbose # Enables verbose mode
--noverbose # Disables verbose mode
然后,您可以使用"verbose!"
来处理该问题。此外,由于默认情况下启用了verbose
模式,因此实际上不需要支持--verbose
;有--verbose 0
关闭它,或者--noverbose
,并且可能指出允许--verbose 9
额外详细等等。你需要考虑你的设计是否真的合适。 / p>