如何从命令行提供非 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
子句是任意条件,其计算结果为 True
或 False
。将要绑定到 variable/parameter 的值(如果它通过约束条件)隐含地 "it" 用于条件。
只要表达式包含一个或多个运算符与一个或多个 *
组合作为操作数,Raku 会将表达式转换为函数,其中 *
(s ) 是该函数的参数。
所以 +*
是一个很小的单参数函数,它只是将前缀 +
应用于它的一个参数,也就是 "it".
当您将前缀 +
应用于数组时,它 returns 该数组中元素的 Int
计数。从条件表达式返回的值计算为 Bool
-- True
或 False
。如果它是 0
(即没有传递任何参数),约束条件 returns False
因此 MAIN
签名无法绑定并显示用法消息。
如果不是这样,可能是因为最后每个命令行只能使用一个数组 slurpy。
或者只是好奇。
命名数组的工作方式如下:
sub MAIN ( :@n ) {}
my shell prompt> cli-prog.raku -n=www.example.com -n=example.com
您可以接管 CLI 解析的控制权以获得您想要的任何结果:
SuperMAIN
, a strict superset of the built in MAIN
functionality.
"My experience building out a command line application in production" (video, slides)
首先: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
子句是任意条件,其计算结果为 True
或 False
。将要绑定到 variable/parameter 的值(如果它通过约束条件)隐含地 "it" 用于条件。
只要表达式包含一个或多个运算符与一个或多个 *
组合作为操作数,Raku 会将表达式转换为函数,其中 *
(s ) 是该函数的参数。
所以 +*
是一个很小的单参数函数,它只是将前缀 +
应用于它的一个参数,也就是 "it".
当您将前缀 +
应用于数组时,它 returns 该数组中元素的 Int
计数。从条件表达式返回的值计算为 Bool
-- True
或 False
。如果它是 0
(即没有传递任何参数),约束条件 returns False
因此 MAIN
签名无法绑定并显示用法消息。
如果不是这样,可能是因为最后每个命令行只能使用一个数组 slurpy。
或者只是好奇。
命名数组的工作方式如下:
sub MAIN ( :@n ) {}
my shell prompt> cli-prog.raku -n=www.example.com -n=example.com
您可以接管 CLI 解析的控制权以获得您想要的任何结果:
SuperMAIN
, a strict superset of the built inMAIN
functionality."My experience building out a command line application in production" (video, slides)