如何获得 Perl 的 Getopt::Long 来判断参数是不是丢失?

Posted

技术标签:

【中文标题】如何获得 Perl 的 Getopt::Long 来判断参数是不是丢失?【英文标题】:How can I get Perl's Getopt::Long to tell if arguments are missing?如何获得 Perl 的 Getopt::Long 来判断参数是否丢失? 【发布时间】:2011-03-26 23:12:13 【问题描述】:

我正在使用 Perl 的 Getopt::Long 模块来解析命令行参数。但是,即使缺少某些参数,它似乎也会返回一个真值。有没有办法判断是不是这种情况?

【问题讨论】:

好问题。我希望有一种方法可以做到这一点,而不是检查 undef 的值。 这让很多人感到困惑是可以理解的,因为 Getopt 的文档暗示您可以指定所需的选项。 “对于具有价值的期权,必须指定是否需要期权价值,以及期权期望什么样的价值。” perldoc.perl.org/Getopt/Long.html 【参考方案1】:

在普通的旧 Getopt::Long 中,您不能直接执行此操作 - 正如 Jonathan 所说,您需要检查您对 undef 的要求。但是,恕我直言,这是一件好事——什么是“必需”参数?通常,在一种情况下需要的参数而不是另一种情况下需要的参数——这里最常见的例子是--help 选项的痛点。它不是必需的,如果用户使用它,他可能不知道或不会传递任何其他“必需”参数。

我在我的一些代码中使用了这个成语(嗯,我曾经使用过,直到我改用MooseX::Getopt):

use List:MoreUtils 'all';

Getopt::Long::GetOptions(\%options, @opt_spec);
print usage(), exit if $optionshelp;
die usage() unless all  defined $options$_  @required_options;

即使使用 MooseX::Getopt 我也不会将我的属性设置为 required => 1,这也是因为 --help 选项。相反,我在进入程序执行主体之前检查是否存在我需要的所有属性。

package MyApp::Prog;
use Moose;
with 'MooseX::Getopt';

has foo => (
    is => 'ro', isa => 'Str',
    documentation => 'Provides the foo for the frobnitz',
);
has bar => (
    is => 'ro', isa => 'Int',
    documentation => 'Quantity of bar furbles to use when creating the frobnitz',
);

# run just after startup; use to verify system, initialize DB etc.
sub setup

    my $this = shift;

    die "Required option foo!\n" unless $this->foo;
    die "Required option bar!\n" unless $this->bar;

    # ...

【讨论】:

【参考方案2】:

选项是可选的,因此命名为“Getopt”。

您检查Getopt::Long设置的选项值;如果关键之一是“undef”,则它被遗漏了,您可以识别它。

返回值告诉你命令行中没有可怕的错误。错误的构成取决于您如何使用Getopt::Long,但一个经典的错误是命令行包含-o output,但该命令无法识别-o 选项。

【讨论】:

有时选项不是可选的。 @tster:我同意;有时,一个命令确实需要一些特定的选项才能出现——如果能够通知 Getopt 包就是这种情况,那就太好了。也许其他一些 Getopt 包支持它?有很多可供选择(我自己推出了 - 但它不支持强制参数)。有一个论点是强制选项前面不应该需要一个减号;它们成为位置论据。但是,如果有多个这样的参数,位置很快就会变得难以记住。

以上是关于如何获得 Perl 的 Getopt::Long 来判断参数是不是丢失?的主要内容,如果未能解决你的问题,请参考以下文章

Perl模块 Getopt::Long 解析

在Perl中使用Getopt::Long进行命令行解析

在 Perl 中使用 Getopt 时如何对参数进行分组?

Getopt :: Long将包含空格的字符串转换为变量

perl xttdriver.pl fails: Can't locate Getopt/Long.pm in @INC (Doc ID 1912400.1)

使用Perl解析JSON