Perl的Getopt :: Long怎么能发现缺少强制参数的参数?

时间:2016-10-05 20:33:03

标签: perl getopt-long

在我的一个脚本中,我使用Getopt::Long库。在节目开始时我打电话:

&GetOptions ('help', 'debug', 'user=s' => \$GetUser);

前两个论点很简单:我分别通过检查$opt_help$opt_debug来发现它们的存在。然而第三个参数很棘手,因为我需要区分没有选项($ GetUser未定义,这对我来说没问题),使用" - user"单独($GetUser也是未定义的,但这次我想显示错误信息)和" - 用户FooBar" ($GetUser收到' FooBar',我可以在进一步处理中使用)。

如何区分不使用" - 用户"选项并单独使用,没有用户名?

1 个答案:

答案 0 :(得分:7)

您正在寻找:而不是=,所以'user:s' => \$GetUser。来自Options with values

  

使用冒号:而不是等号表示选项值是可选的。在这种情况下,如果未提供合适的值,则字符串值选项将分配空字符串'',而数字选项设置为0

这允许您合法地使用--user调用该程序而没有值(=这是一个错误)。然后你只声明my $GetUser;并在处理选项之后你可以告诉发生了什么。如果它是undef则未提及,如果它是''(空字符串),则调用时没有值,您可以发出消息。这假定''在您的程序中没有任何其他用途。

否则,当您使用'user=s'并且未给出任何值时,GetOptions会通过返回false报告错误并向STDERR发出描述性消息。所以你可能会离开它并做

GetOptions( 'user=s' => ...)  or die "Option error\n";

依靠模块捕获并报告错误使用。上面我们自己的消息并不是真的需要,因为模块的消息清楚地描述了这个问题。

另一种方法是按照

的方式行事
usage(), exit  if not GetOptions('user=s' => \$GetUser, ...);

sub usage { 
    # Your usage message, briefly listing options etc.
}

我想补充一点 - 在函数调用前不需要&。它使调用者的@_可见,忽略了函数原型,并做了一些其他类似的事情。一个常见的用途是获取需要的coderef $rc = \&fun。请参阅示例this post