小编acw*_*acw的帖子

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

首先:raku (perl6) 很棒。克罗也是。只用了一个周末就坠入爱河。但是现在我偶然发现了一些必须非常简单的东西。

如果我在多分派 MAIN 中使用 slurpy 参数,则可以识别并完美运行:

multi MAIN( 'config', 'add', *@hostnames ) {
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其设为非 slurpy 数组,则要么无法识别,要么我不知道如何从命令行提供它:

multi MAIN( 'config', 'add', @hostnames ) {
Run Code Online (Sandbox Code Playgroud)

我希望这些调用之一能够工作:

$ 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
Run Code Online (Sandbox Code Playgroud)

Cro CLI 中使用了类似的构造,但是没有示例说明如何使用文档中的数组调用其中一个命令。

我也用一个数组作为命名参数尝试了这个:

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

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

$ cli.raku config add --hostnames=www.example.com example.com
Run Code Online (Sandbox Code Playgroud)

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

multiple-dispatch command-line-interface named-parameters raku

12
推荐指数
1
解决办法
139
查看次数

使用 HTTP/2 时如何在 Cro 中获取 Host 或 :authority 标头

当使用克罗马与HTTP1.1我可以通过这两个主机的方法访问请求的主机request.uri.host克罗马::乌里权威标头中发送的浏览器通过:以及主机或request.header在方法克罗马:: HTTP ::请求

但是,当我使用 HTTP/2 时,这些都不起作用。Uri 对象仅包含架构和路径。

我正在使用带有子域通配符的官方证书,并通过将这些子域添加到我的主机文件来在本地运行它。Chrome DevTools 说它已经在 HTTP/2 下发送了 :authority 请求标头,Firefox Developer Tools 说它已经在 HTTP/2 下发送了 Host 请求标头。但是,如果我将标头写入如下所示的日志,我会看到几个标头,但看不到 Host 或 :authority 标头。

sub routes() is export {
  route {
    get -> {
      my $log = "/data/myapp/logs/cro.log";
      my $fh = open $log, :w;
      my $host = request.uri.host;
      $fh.say( "Host with host method: " ~ $host );
      $host = request.header('Host');
      $fh.say( "Host: " ~ $host );
      $host = request.header(':authority');
      $fh.say(":authority: " …
Run Code Online (Sandbox Code Playgroud)

virtualhost request-headers http2 cro raku

8
推荐指数
1
解决办法
901
查看次数

在将参数传递给 sub MAIN 之前更改参数的处理方式

鉴于文档和对较早问题的评论,根据要求,我制作了一个最小的可重现示例,演示了这两个语句之间的区别:

my %*SUB-MAIN-OPTS = :named-anywhere;
PROCESS::<%SUB-MAIN-OPTS><named-anywhere> = True;
Run Code Online (Sandbox Code Playgroud)

给定一个只有这个的脚本文件:

#!/usr/bin/env raku
use MyApp::Tools::CLI;
Run Code Online (Sandbox Code Playgroud)

以及 MyApp/Tools 中名为 CLI.pm6 的模块文件:

#PROCESS::<%SUB-MAIN-OPTS><named-anywhere> = True;
my %*SUB-MAIN-OPTS = :named-anywhere;

proto MAIN(|) is export {*}

multi MAIN( 'add', :h( :$hostnames ) ) {
    for @$hostnames -> $host {
        say $host;
    }
}

multi MAIN( 'remove', *@hostnames ) {
    for @hostnames -> $host {
        say $host;
    }
}
Run Code Online (Sandbox Code Playgroud)

从命令行进行以下调用不会产生可识别的子例程,但会显示用法:

mre.raku add -h=localhost -h=test1
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,切换my %*SUB-MAIN-OPTS = :named-anywhere;PROCESS::<%SUB-MAIN-OPTS><named-anywhere> = True; …

program-entry-point raku

5
推荐指数
1
解决办法
101
查看次数