在我的一个脚本中,我使用Getopt::Long库。在节目开始时我打电话:
&GetOptions ('help', 'debug', 'user=s' => \$GetUser);
前两个论点很简单:我分别通过检查$opt_help
和$opt_debug
来发现它们的存在。然而第三个参数很棘手,因为我需要区分没有选项($ GetUser未定义,这对我来说没问题),使用" - user"单独($GetUser
也是未定义的,但这次我想显示错误信息)和" - 用户FooBar" ($GetUser
收到' FooBar',我可以在进一步处理中使用)。
如何区分不使用" - 用户"选项并单独使用,没有用户名?
答案 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