12

首先: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中使用了类似的构造,但是没有示例说明如何在docs中使用数组调用其中一个命令。

我还尝试使用数组作为命名参数:

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

鉴于raku 文档中的示例,我希望这可以工作:

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

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

4

1 回答 1

10

Raku 中内置的 arg 解析对应于标准 shell 功能/约定。正如 JJ 所指出的,单个阵列没有外壳功能/约定。我想这就是为什么 plain @foo(and %bar) 没有被定义为匹配任何东西作为内置 CLI 解析功能的一部分。


您的示例将被 slurpy 覆盖,而您还没有说明为什么不想使用 slurpy。

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

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

您可以将其读+*作“一个或多个”。

实际上发生的事情是我写了一个where子句。除了任何其他约束(例如类型)之外,这是对变量或参数施加的约束。where子句是评估为Trueor的任意条件False。即将绑定到变量/参数的值(如果它通过约束条件)隐含地是条件的“它”。

每当一个表达式包含一个或多个运算符以及一个或多个*s 作为操作数时,Raku 将表达式转换为一个函数,其中*(s) 是该函数的参数。

+*一个很小的参数函数也是如此,它只是将前缀应用于+它的一个参数,即“它”。

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


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

或者只是好奇。


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

sub MAIN ( :@n ) {}

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

搜索“[raku] getopt”的 SO


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

于 2020-06-05T00:16:31.917 回答