Perl Getopt :: Long,支持参数空间

时间:2011-04-13 06:40:44

标签: perl getopt-long

我有一个perl脚本,它使用GetOpts long.A命令如

automate -action build,deploy -modules chat,email,login 很容易处理。

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

E.g

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

问题是,GetOpt::Long在内部使用@ARGV,根据需要设置变量,空格会更改@ARGV数组,而这只会将'build'设为一个动作,只有'chat'作为脚本的模块,忽略了传递的其余参数。

是否有一种简单的方法来解析perl中的命令行?

我希望有,因为否则我将不得不使用一种非常hacky的方式来更改@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.",".$_;
      }
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

你会坚持使用逗号吗?这样做很笨拙。我可以看到:

automate -action build deploy -modules chat email login

在某些争论结束时要求使用逗号会觉得 - 很奇怪。

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

somecmd -f - --

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