Perl 的 Getopt::Long 如何发现缺少强制参数的参数?

How can Perl's Getopt::Long discover arguments with mandatory parameter missing?

在我的一个脚本中,我使用了 Getopt::Long 库。在程序的开头我打了个电话:

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

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

如何区分不使用“--user”选项和不使用用户名单独使用它?

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

Using a colon : instead of the equals sign indicates that the option value is optional. In this case, if no suitable value is supplied, string valued options get an empty string '' assigned, while numeric options are set to 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.
}

我想补充一点——你不需要在函数调用前加上 &。它使调用者的 @_ 可见,忽略函数原型,并做一些其他类似的事情。一个常见的用途是在需要的地方获取代码引用 $rc = \&fun。例如参见 [​​=31=]