19

如果我有这样的命令行:

my_script.pl -foo -WHATEVER

我的脚本知道--foo,我希望 Getopt 设置变量$opt_foo,但我对-WHATEVER. 我如何告诉 Getopt 解析出我告诉它的选项,然后在字符串变量或列表中获取其余参数?

一个例子:

use strict;
use warnings;

use Getopt::Long;

my $foo; 

GetOptions('foo' => \$foo); 

print 'remaining options: ', @ARGV;

然后,发出

perl getopttest.pl -foo -WHATEVER

未知选项:随便
剩余选项:
4

3 回答 3

23

您需要通过配置“pass_through”选项Getopt::Long::Configure("pass_through");

然后它支持实际选项(例如,以“-”开头的东西,没有特殊的“--”分隔符来表示“真实”选项的结束)。

这是 perldoc 报价

  • pass_through(默认:禁用)

    未知、模棱两可或提供了无效选项值的选项会被传入,@ARGV而不是被标记为错误。这使得编写只处理部分用户提供的命令行参数并将剩余选项传递给其他程序的包装脚本成为可能。

这是一个例子

$ cat my_script.pl
#!/usr/local/bin/perl5.8 -w

use Getopt::Long;
Getopt::Long::Configure("pass_through");
use Data::Dumper;
my %args;
GetOptions(\%args, "foo") or die "GetOption returned 0\n";
print Data::Dumper->Dump([\@ARGV],["ARGV"]);

$ ./my_script.pl -foo -WHATEVER          
$ARGV = [
          '-WHATEVER'
        ];
于 2010-06-08T23:53:47.970 回答
1

剩余的(未解析的)值不是简单地留在后面@ARGV吗?如果您的额外内容以破折号开头,您将需要使用 : 指示选项列表的结尾--

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use Data::Dumper;

my $foo;
my $result = GetOptions ("foo"   => \$foo);
print Dumper([ $foo, \@ARGV ]);

然后调用:

my_script.pl --foo -- --WHATEVER

给出:

$VAR1 = [
          1,
          [
            '--WHATEVER'
          ]
        ];

PS。在MooseX::Getopt中,命令行中的“剩余”选项作为 arrayref 放入extra_argv属性中——所以我建议转换!

于 2010-06-08T23:41:30.467 回答
0

但遗憾的是,我认为这里的答案是“不,没有办法完全按照你的要求,使用 Getopt::Long,而不需要自己解析 @ARGV。” 不过,以太坊有一个不错的解决方法。就大多数人而言,这是一个功能,即任何类似选项的参数都会被捕获为错误。通常,您可以这样做

GetOptions('foo' => \$foo) 
    or die "Whups, got options we don't recognize!";

捕获/防止通过奇怪的选项,然后您可以更正用户的使用情况。或者,您可以简单地通过并忽略它们。

于 2010-06-08T23:50:38.447 回答