如何从命令行提供非 slurpy 数组或命名数组?

How to provide a non-slurpy array or named array from the command line?

首先:raku (perl6) 很棒。克罗也是。只用了一个周末就坠入爱河。但是现在我偶然发现了一些必须非常简单的东西。

如果我在多重分派 MAIN 中使用 slurpy 参数,这将被识别并完美运行:

multi MAIN( 'config', 'add', *@hostnames ) {

但是,如果我将其设为非 slurpy 数组,则无法识别或者我不知道如何从命令行提供它:

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 however without example of how to call one of the commands with an array in the docs.

中使用了类似的结构

我也试过用数组作为命名参数:

my %*SUB-MAIN-OPTS = :named-anywhere;
multi MAIN( 'config', 'add', :@hostnames) {

鉴于 raku docs 中的示例,我希望它能够工作:

$ cli.raku config add --hostnames=www.example.com example.com

但它没有,也没有用逗号或 space 逗号分隔的变体。在所有情况下,我都会获得使用信息。

Raku内置的arg解析对应标准shellfeatures/conventions。正如 JJ 所指出的,单个数组没有 shell feature/convention。我想这就是为什么普通 @foo(和 %bar)未定义为匹配任何内容作为内置 CLI 解析功能的一部分。


你的例子会被 slurpy 覆盖,而你还没有说为什么你不想使用 slurpy。

一种猜测是因为 slurpy 允许零参数。这是解决该问题的惯用方法:

multi MAIN( 'config', 'add', *@hostnames where +*) {

您可以将 +* 读为 "one or more"。

实际发生的事情是我写了一个 where 子句。除了任何其他约束(例如类型)之外,这是对变量或参数施加的约束。 where 子句是任意条件,其计算结果为 TrueFalse。将要绑定到 variable/parameter 的值(如果它通过约束条件)隐含地 "it" 用于条件。

只要表达式包含一个或多个运算符与一个或多个 * 组合作为操作数,Raku 会将表达式转换为函数,其中 *(s ) 是该函数的参数。

所以 +* 是一个很小的单参数函数,它只是将前缀 + 应用于它的一个参数,也就是 "it".

当您将前缀 + 应用于数组时,它 returns 该数组中元素的 Int 计数。从条件表达式返回的值计算为 Bool -- TrueFalse。如果它是 0(即没有传递任何参数),约束条件 returns False 因此 MAIN 签名无法绑定并显示用法消息。


如果不是这样,可能是因为最后每个命令行只能使用一个数组 slurpy。

或者只是好奇。


命名数组的工作方式如下:

sub MAIN ( :@n ) {}

my shell prompt> cli-prog.raku -n=www.example.com -n=example.com

搜索 "[raku] getopt"


您可以接管 CLI 解析的控制权以获得您想要的任何结果: