2

我有一个 Perl 脚本,它使用 GetOpts long。像这样的命令很容易处理:

automate -action build,deploy -modules chat,email,login 

我想要实现的是允许用户在参数之间留出空格。

例如

automate -action build, deploy   -modules chat, email, login

问题是GetOpt::Long内部用于@ARGV根据需要设置变量,并且空格会更改@ARGV数组,这反过来只会将“构建”作为操作,而仅将“聊天”作为脚本的模块,而忽略其余的参数通过。

有没有一种简单的方法来解析上面 Perl 中的命令行?

我希望有,因为否则我将不得不使用一种非常老套的方法来更改@ARGV数组,然后再将其传递给 GetOpts。

是否还有其他强大的库可以为我做到这一点?

---------------------------------------量身定做的脚本------- -------------

GetOptions("action=s{1,4}"=>\@myactions,
            "modules=s{,}"=>\@mymodules);

foreach(@mymodules)
{
      if($_ eq $mymodules[0])
      {
          $mymodules= $mymodules.$_;
          next;
      }
      if($dashboards =~ m/,$/ || $_ =~ m/^,/)
      {
          $mymodules= $mymodules.$_;
      }
      else
      {
          $mymodules= $mymodules.",".$_;
      }
}
4

2 回答 2

4

在 Getopt::Long perldoc 中查看此 Options with multiple values部分。它看起来与您正在寻找的相似。

例子:

    GetOptions ("action=s{,}" => \@valuelist);
    @values = split(/[\s,]+/,join(',' , @valuelist));

    # @values will contain the list of values passed to the option.
    # This can handle the scenarios:
    # <command> -action build,deploy
    # <command> -action build, deploy
    # <command> -action build deploy
于 2011-04-13T08:05:20.003 回答
1

这是一个非标准的命令行用法——所以你需要一个非标准的命令行解析器。如果您在http://search.cpan.org/搜索“getopt”,则会列出大约 180 个单独的条目,因此有很多可供选择。

从表面上看,您只是想识别一些长选项名称,然后在读取前一个选项名称时继续应用非选项参数。

你会坚持尾随逗号吗?这样做感觉很笨拙。我可以看到:

automate -action build deploy -modules chat email login

在一些论点的结尾要求逗号会让人感觉很奇怪。

您需要考虑双破折号选项是否具有特殊意义,以及单破折号选项是否具有特殊意义:

somecmd -f - --

我不知道有一个 Perl 模块可以处理您选择的符号,或者它的任何细微变化。这与说没有这样的模块并不完全相同,但是您正在尝试一种稍微不寻常的参数解析样式,因此很可能没有人完全实现了您想要的。

于 2011-04-13T07:20:43.317 回答