Perl Getopt::参数的长支持空间
我有一个Perl脚本,它使用GetOpts long。这样的命令很容易处理: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中那样解析命令行 我希望有,否则
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