在我的一个脚本中,我使用了Getopt :: Long库.在程序开始时我打电话:
&GetOptions ('help', 'debug', 'user=s' => \$GetUser);
Run Code Online (Sandbox Code Playgroud)
前两个论点很简单:我通过分别检查$opt_help和发现它们的存在$opt_debug.然而第三个参数很棘手,因为我需要区分没有选项($ GetUser未定义,这对我来说没问题),单独使用"--user"($GetUser也是未定义的,但这次我要显示一个错误消息)和"--user FooBar"($GetUser接收'FooBar',我可以在进一步处理中使用).
如何在没有用户名的情况下区分不使用"--user"选项和单独使用它?
您正在寻找:的替代=,所以'user:s' => \$GetUser.来自带有值的选项
使用冒号:而不是等号表示选项值是可选的.在这种情况下,如果未提供合适的值,则字符串值选项将
''分配空字符串,而数字选项将设置为0
这允许您合法地调用程序,但--user没有值(=这是一个错误).然后你只需要声明my $GetUser;,在处理选项之后你就可以知道发生了什么.如果它undef没有被提及,如果它是''(空字符串)它被调用没有值,你可以发出你的消息.这假设它''在您的程序中没有任何其他用途.
否则,当您使用'user=s'并且没有给出任何值时,GetOptions通过返回false并向其发出描述性消息来报告错误STDERR.所以你可能会离开它并做到
GetOptions( 'user=s' => ...) or die "Option error\n";
Run Code Online (Sandbox Code Playgroud)
并依靠该模块来捕获并报告错误使用.由于模块的消息清楚地描述了问题,因此我们不需要上面提供的消息.
另一种方法是这样做
usage(), exit if not GetOptions('user=s' => \$GetUser, ...);
sub usage {
# Your usage message, briefly listing options etc.
}
Run Code Online (Sandbox Code Playgroud)
我想补充一点 - 你不需要&在函数调用前面.它使调用者@_可见,忽略函数原型,并做一些其他类似的事情.一个常见的用途是获取需要的coderef $rc = \&fun.例如,参见这篇文章
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |