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

问题描述 投票:7回答:1

首先: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

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

command-line-interface raku named-parameters multiple-dispatch
1个回答
7
投票

Raku中内置的arg解析与标准的shell功能/约定相对应。正如JJ所指出的,单个阵列没有外壳功能/约定。我认为这就是为什么未定义普通@foo(和%bar)作为内置CLI解析功能的一部分来匹配任何内容的原因。


您的示例将包含一个草率的内容,而您尚未说明为什么不想使用一个草率的内容。

一个猜测是,因为粗鲁地允许零个参数。这是解决该问题的惯用方法:

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

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

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

[每当一个表达式包含一个或多个运算符并与一个或多个*组合为操作数时,Raku会将表达式转换为一个函数,其中*是该函数的参数。

所以+*是一个很小的小参数函数,仅将前缀+应用于其一个自变量,也称为“ it”。

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


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

或者只是出于好奇。


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

sub MAIN ( :@n ) {}

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

搜索"[raku] getopt"的SO


您可以控制CLI解析以获得所需的任何结果:

© www.soinside.com 2019 - 2024. All rights reserved.