【问题标题】:How can I allow undefined options when parsing args with Getopt使用 Getopt 解析 args 时如何允许未定义的选项
【发布时间】:2010-06-08 23:22:41
【问题描述】:

如果我有这样的命令行:

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

给予

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

【问题讨论】:

    标签: perl getopt getopt-long


    【解决方案1】:

    您需要通过Getopt::Long::Configure("pass_through");配置“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'
            ];
    

    【讨论】:

    • 哈哈,这就解释了为什么我没有找到它... :)
    • 我发现在 perldoc 网站上阅读一些简洁的选项非常令人愤怒,然后回到我的中型公司 Perl 安装,发现我找到的完全完美的选项需要一个磁通电容器,或者至少CPAN 模块升级
    • 您确定pass_through 不适用于 5.8 吗?我刚刚检查了perldoc Getopt::Long 的 5.6.1(你以为你是史前的 ;))它就在那里。
    • @Zaid - 你完全正确!我没有完全正确阅读 POD,正在寻找通过 import 配置的选项;这个是通过特殊的Configure() 电话完成的。我已经更新了我的答案。
    • 我刚刚向 MooseX::Getopt 队列添加了一个功能请求以允许这样的配置:rt.cpan.org/Ticket/Display.html?id=58704(所以如果你喜欢它,请回复“我也是”):)
    【解决方案2】:

    剩余的(未解析的)值不是简单地留在@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 属性中——所以我建议转换!

    【讨论】:

    • 如果它们看起来像选项,它们就不是。相反,将向 STDERR 发出类似 Unknown option: WHATEVER 的错误。
    • :] 确实!哈哈,这个问题我也加了一个这样的例子。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多