从Getopt :: Long操作GetOptions中的标志类型

时间:2015-03-18 20:06:35

标签: perl getopt

如果在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");

3 个答案:

答案 0 :(得分:1)

这可能有点过于复杂,但您可以将optional valuecustom 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>