Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Getopt::参数的长支持空间_Perl_Getopt Long - Fatal编程技术网

Perl Getopt::参数的长支持空间

Perl Getopt::参数的长支持空间,perl,getopt-long,Perl,Getopt Long,我有一个Perl脚本,它使用GetOpts long。这样的命令很容易处理: automate -action build,deploy -modules chat,email,login 我想要实现的是允许用户在参数之间留出空格 例如 问题在于GetOpt::Long在内部使用@ARGV根据需要设置变量,空格会更改@ARGV数组,这反过来只会将“build”作为操作,将“chat”作为脚本的模块,而忽略传递的其余参数 有没有一种简单的方法可以像上面在Perl中那样解析命令行 我希望有,否则

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

automate -action build,deploy -modules chat,email,login 
我想要实现的是允许用户在参数之间留出空格

例如

问题在于GetOpt::Long在内部使用@ARGV根据需要设置变量,空格会更改@ARGV数组,这反过来只会将“build”作为操作,将“chat”作为脚本的模块,而忽略传递的其余参数

有没有一种简单的方法可以像上面在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.",".$_;
      }
}

这是一种非标准的命令行用法——因此您需要一个非标准的命令行解析器。如果您在上搜索“getopt”,将列出大约180个单独的条目,因此有许多可供选择

表面上看,您只需要识别一些长的选项名,然后在读取之前的选项名时继续将非选项参数应用于它们

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

automate -action build deploy -modules chat email login
在某些参数的末尾使用逗号会让人觉得很奇怪

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

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

请查看Getopt::Long perldoc中的这一部分。它看起来和你要找的东西很相似

例如:

    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

是的,我已经查过了。那只允许我用空格分隔,默认情况下逗号不会构成参数的一部分。。。尽管如此,我还是想出了我自己的剧本来完成这件事,请让我知道其中是否有陷阱。。这将是一个很大的帮助。我会在某个时候更新我的问题。@Neeraj-是的,你是对的。默认情况下,多个值之间用空格分隔。但是,如果您选择使用分隔符,您不能拆分以获得传递的值列表吗?我已经用我想到的解决方案更新了我的答案,以防万一…你发布的答案,我已经在代码中实现了。但是只有更精细、增强的版本。我已经在答案中添加了脚本。脚本甚至允许-action deploy、package之类的东西。你发布的脚本,这将以错误的值字符串结束,因为“deploy”“package”将被视为三个不同的参数。这不是一个好主意-使用空格分隔的参数列表与大多数CLI UI标准相反。在设计UI命令行时,如果没有很好的理由,您永远不应该偏离大多数用户熟悉的方式。请注意,在调用GetOptions之前,您可以以任何方式规范化@ARGV。但是,这是一个非常糟糕的想法,因为人们不会期望这种接口;使用符号automatic-action-build、deploy-modules-chat、email、login,shell只传递5个参数。您可能会在命令行上使用自动操作构建、部署模块、聊天、电子邮件和登录;至少脚本只有5个参数,并且可以拆分包含空格的参数。我坚持这样的观点,即期望的用法是不寻常的,通常不受支持。
    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