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

2024-05-07

首先: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 https://github.com/croservices/cro/blob/master/lib/Cro/Tools/CLI.pm6但是没有示例如何使用数组调用命令之一docs https://github.com/croservices/cro/blob/master/docs/cro-tool.md.

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

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

鉴于中的例子乐文档 https://docs.raku.org/language/create-cli#%25*SUB-MAIN-OPTS我希望这能起作用:

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

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


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


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

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

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

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

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

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

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

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


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

或者只是好奇心。


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

sub MAIN ( :@n ) {}

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

搜索 SO“[raku] getopt” https://stackoverflow.com/search?q=%5Braku%5D+getopt


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

  • A Raku getopt执行 https://modules.raku.org/dist/Getopt::Long:cpan:LEONT

  • SuperMAIN,内置的严格超集MAIN功能性 https://github.com/nxadm/SuperMAIN.

  • “我在生产中构建命令行应用程序的经验”(video https://www.youtube.com/watch?v=D16wa-gnFwE, slides http://bduggan.github.io/meta-perl6-cli/#1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从命令行提供非 slurpy 数组或命名数组? 的相关文章

  • 如何在Raku中逐行读取gz文件

    我正在尝试在 Raku 中逐行读取一个巨大的 gz 文件 我正在尝试做这样的事情 my file huge file gz for file IO lines gt line say line 但这给出了我的 UTF 8 格式错误的错误 我
  • 如何知道脚本是从 django 还是从 cli 运行

    我有 config py 可以从 cli python 脚本和 Django view py 导入 如何知道 config py 中的什么进程导入了它 Django 中可能有一些特殊的变量吗 I tried if sys stdin isa
  • mail() 超时问题

    当我通过浏览器执行电子邮件脚本时 会返回超时致命错误 除非我大幅增加执行时间 否则它将正常运行 而不是我正在寻找的解决方案 电子邮件已发送 但需要很长时间 平均 5 分钟 才能到达 我的收件箱 考虑到通过命令行它可以完美地工作 我认为 ph
  • Perl 6 可以根据排序规则进行排序或比较吗?

    The cmp操作员 https docs perl6 org language operators infix cmp适用于代码编号 或者至少我认为它是这样做的 因为文档对此没有明确说明 并且没有提及任何本地化内容 我可以按照其他排序规则
  • 如何将 raku -e 和 -n 与多个文件 glob 一起使用

    我想在 Windows 上的 raku 中执行以下操作 raku n e say if mydatabegin file 无法打开文件 C file 参数无效 glob 不被解释为 glob 我认为这是因为 Windows 要求你的程序自己
  • 发送 cmdarray 供 exec 处理——hello world

    我不是发送一系列命令 hello world 到exec https docs oracle com javase 7 docs api java lang Runtime html exec 28java lang String 5B 5
  • Perl 6 语法与我认为的不匹配

    我正在做代码出现第 9 天 http adventofcode com 2017 day 9 您坐了一会儿并记录了流的一部分 您的谜题输入 这些字符代表组 开头的序列 并结束于 在一个组内 有零个或多个其他东西 用逗号分隔 要么是另一个组
  • 如何在 PHP CLI 中检测 STDOUT 重定向?

    我有一个 PHP CLI 脚本 它使用 shell 转义序列进行粗体显示 但我希望能够在脚本重定向 例如重定向到日志文件 时自动禁用这些序列 到目前为止 我可以找到在除 PHP 之外的所有内容中检测 STDOUT 重定向的方法 所以有人可以
  • ImageMagick - 向图像添加白色透明覆盖层

    我需要拍摄一张正常的图像 并添加白色透明覆盖层 使其看起来像这样 不要注意转换后图像上的文本或它是原始图像的裁剪版本这一事实 我需要简单地将顶部转换为完全相同的图像 只是使用白色透明的覆盖层 我还需要它是一个 cli 命令 更新答案 这更容
  • 如何在 PHP 中运行 ffmpeg 命令

    我需要在 PHP 中运行 ffmpeg 命令 但是 php ffmpeg 不再支持最新版本并且已经过时 我可以知道在网络文件中运行 ffmpeg 命令的替代方法吗 PHP Javascript jQuery 我尝试exec and shel
  • 为所有图像添加前缀(递归)

    我有一个包含 5000 多张图像的文件夹 全部带有 JPG 扩展名 我想要做的就是递归地向所有图像添加 thumb 前缀 我发现了一个类似的问题 重命名文件和目录 添加前缀 https stackoverflow com questions
  • 在 macOS 上运行 Comma IDE 时找不到匹配的虚拟机

    我安装了 Comma IDEthis https commaide com download链接 但当我尝试通过双击应用程序文件夹中 Finder 中的应用程序图标来运行它时 出现错误 未找到匹配的 VM 需要 Java 1 8 或更高版本
  • coreapi 操作,没有当前文档

    我正在尝试使用 coreapi 和 Django Rest Framework 进行发布 我正在关注这个tutorial https wsvincent com official django rest framework tutorial
  • 每秒打印一些东西,并且在 Perl 6 中使用 React 每 5 秒睡眠 10 秒?

    我想每秒打印当前时间 并且还想每5秒睡眠10秒 react whenever Supply interval 1 say DateTime now posix whenever Supply interval 5 sleep 10 say
  • TUI模式下的GDB:如何处理stderr与ui的交互

    我正在尝试使用gdb来调试caffe http caffe berkeleyvision org 我更喜欢使用 tui 模式 因为它允许我查看整个源代码而不仅仅是一行 但有一个问题 每当程序caffe输出一些东西stderr 输出扭曲了 t
  • 为什么 MySQLi 库本身不支持命名参数?

    正确的 MySQLi 参数化查询语法来自http php net manual en mysqli quickstart prepared statements php http php net manual en mysqli quick
  • Windows 10 中的 npm 安装错误( npm install -g angular-cli )

    node v v4 5 0 npm v 5 0 1 有人在 Windows 10 中安装 angular cli 时遇到过这种问题吗 请尝试以下操作 step 0 运行这个命令 npm uninstall g angular cli npm
  • Perl 6 字符将匹配哪些 Unicode 属性?

    The uniprop返回单个属性 put join A uniprop 我取回一项财产 一般类别 Lu 环顾四周 我没有找到一种方法来获取所有其他属性 包括派生属性 例如ID Start等等 我缺少什么 我知道我可以查看数据文件 但我宁愿
  • 使用 Composer CLI 将数据添加到额外属性

    根据文档extra的财产composer json 架构 https getcomposer org doc 04 schema md extra 允许设置 供脚本使用的任意额外数据 出于脚本目的 如果可以将数据添加到extra通过命令行属
  • 在 Windows 上使用“perl6”命令和 Git Bash

    使用 Windows 我安装了乐道之星 https rakudo org files和 Git 并确保C rakudo bin and C rakudo share perl6 site bin位于我的 Path 环境变量中 现在 输入pe

随机推荐