【问题标题】:How can Perl's Getopt::Long discover arguments with mandatory parameter missing?Perl 的 Getopt::Long 如何发现缺少强制参数的参数?
【发布时间】:2016-10-05 20:33:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: perl getopt-long


    【解决方案1】:

    您正在寻找: 而不是=,所以'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.
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多