gpt4 book ai didi

command-line-interface - 如何从命令行提供非 slurpy 数组或命名数组?

转载 作者:行者123 更新时间:2023-12-03 15:08:58 25 4
gpt4 key购买 nike

首先: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 docs 中的示例我希望这会起作用:
$ cli.raku config add --hostnames=www.example.com example.com

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

最佳答案

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

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

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

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

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

实际情况是我写了一个 where条款。除了任何其他约束(例如类型)之外,这是对变量或参数施加的约束。一个 where子句是一个任意条件,计算结果为 TrueFalse .即将绑定(bind)到变量/参数的值(如果它通过约束条件)隐含地是条件的“它”。

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

所以 +*是一个很小的参数函数,它只应用前缀 +它的一个论点又名“它”。

当您应用前缀 +到一个数组,它返回 Int该数组中的元素计数。从条件表达式返回的值被评估为 Bool -- TrueFalse .如果是 0 (即没有传递参数),约束条件返回 False所以 MAIN签名绑定(bind)失败并显示使用消息。

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

或者只是好奇。

命名数组的工作方式如下:
sub MAIN ( :@n ) {}

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

在 SO 中搜索 "[raku] getopt"

您可以接管 CLI 解析的控制权以获得您想要的任何结果:
  • A Raku getopt implementation
  • SuperMAIN , a strict superset of the built in MAIN functionality .
  • “我在生产环境中构建命令行应用程序的经验”(videoslides)
  • 关于command-line-interface - 如何从命令行提供非 slurpy 数组或命名数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62205330/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com