首先:Raku(perl6)很棒。 Cro也是。恋爱只花了一个周末。但是,现在我偶然发现了必须非常简单的内容。
如果我在多个分派MAIN中使用一个不可靠的参数,它将被识别并完美地工作:
multi MAIN( 'config', 'add', *@hostnames ) {
但是,如果我将其设置为非糊状的数组,则无法识别它,或者我不知道如何从命令行提供它:
multi MAIN( 'config', 'add', @hostnames ) {
我希望这些调用之一有效:
$ cli.raku config add www.example.com example.com
$ cli.raku config add www.example.com,example.com
$ cli.raku config add www.example.com, example.com
Cro CLI中使用了类似的构造,但是没有如何在docs中使用数组调用命令之一的示例。
我也尝试过使用数组作为命名参数:
my %*SUB-MAIN-OPTS = :named-anywhere;
multi MAIN( 'config', 'add', :@hostnames) {
给出raku docs中的示例,我希望它可以正常工作:
$ cli.raku config add --hostnames=www.example.com example.com
但不是,也没有逗号或空格分隔的变体。在所有情况下,我都会获得使用情况信息。
Raku中内置的arg解析与标准的shell功能/约定相对应。正如JJ所指出的,单个阵列没有外壳功能/约定。我认为这就是为什么未定义普通@foo
(和%bar
)作为内置CLI解析功能的一部分来匹配任何内容的原因。
您的示例将包含一个草率的内容,而您尚未说明为什么不想使用一个草率的内容。
一个猜测是,因为粗鲁地允许零个参数。这是解决该问题的惯用方法:
multi MAIN( 'config', 'add', *@hostnames where +*) {
您可以将+*
读为“一个或多个”。
实际上发生的事情是我写了一个where
子句。除了任何其他约束(例如类型)之外,这是对变量或参数施加的约束。 where
子句是任意条件,其值为True
或False
。将要绑定到变量/参数的值(如果它通过约束条件)对于该条件隐式为“ it”。
[每当一个表达式包含一个或多个运算符并与一个或多个*
组合为操作数时,Raku会将表达式转换为一个函数,其中*
是该函数的参数。
所以+*
是一个很小的小参数函数,仅将前缀+
应用于其一个自变量,也称为“ it”。
将前缀+
应用于数组时,它将返回该数组中元素的Int
计数。从条件表达式返回的值被评估为Bool
-True
或False
。如果它是0
(即未传递任何参数),则约束条件返回False
,因此MAIN
签名无法绑定,并显示用法消息。
如果不是那样,也许是因为最后每个命令行只能使用一个数组混搭。
或者只是出于好奇。
命名数组的工作方式如下:
sub MAIN ( :@n ) {}
my shell prompt> cli-prog.raku -n=www.example.com -n=example.com
搜索"[raku] getopt"的SO
您可以控制CLI解析以获得所需的任何结果:
getopt
。
“我在生产环境中构建命令行应用程序的经验”(SuperMAIN
, a strict superset of the built in MAIN
functionality,SuperMAIN
)