小编Sci*_*mon的帖子

如何使用常量值作为哈希键

是否有一种简单的方法可以将定义常量的值用作Perl6中的散列/对键?

例如 :

constant KEY = "a string";
my %h = ( KEY => "a value" );
Run Code Online (Sandbox Code Playgroud)

这将创建"KEY"而不是"字符串"的键.

我可以 :

my %h = ( "{KEY}" => "a value" );
Run Code Online (Sandbox Code Playgroud)

但这似乎有点笨重.我想知道是否有更好的方法?

perl6 raku

15
推荐指数
1
解决办法
178
查看次数

Perl6中的多种可能的输出类型

我想创建一个返回a Rangeany Junction由多个组成的函数Ranges.

例如:

sub foo (Range $a, Range $b) {
  if $a.min <= $b.max && $b.min <= $a.max {
    ($a.min < $b.min ?? $a.min !! $b.min)..($a.max < $b.max ?? $a.max !! $b.max) 
  } else {
    ($a|$b)  
  }
}
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以向子类添加一个类型约束,以说它可以返回一个Range或一个Junction

想到我已经包括了

  • 在子句中执行检查的Multi子.
  • 子集Any.
  • 总是返回一个交叉点,只需使用一个()(但我想保持范围可能)

但是,如果有一个人可以想到的更简单的方法.

perl6

9
推荐指数
1
解决办法
124
查看次数

从Perl 6中的异常处理程序返回值

我一直在尝试编写一个执行以下逻辑的Perl 6表达式:计算子表达式并返回其值,但如果这样做会导致引发异常,请捕获异常并返回固定值.

例如,假设我想要分割两个数字,并且-1如果发生错误,则将表达式求值为.在Ruby中我可能会写:

quotient = begin; a / b; rescue; -1; end
Run Code Online (Sandbox Code Playgroud)

在Emacs Lisp中可能写成:

(setq quotient (condition-case nil (/ a b) (error -1))
Run Code Online (Sandbox Code Playgroud)

我的第一次Perl 6尝试是这样的:

sub might-throw($a, $b) { die "Zero" if $b == 0; $a / $b }
my $quotient = do { might-throw($a, $b); CATCH { default { -1 } } };
Run Code Online (Sandbox Code Playgroud)

$quotient无论是否$b为零,这里最终都是未定义的.

似乎CATCH忽略了返回的值,或者至少在描述异常如何工作的doc页面上,所有CATCH主体仅执行具有副作用的事情,例如日志记录.

该页面提到try了另一种选择.我可以写一些例子:

my $quotient = try { might-throw($a, $b) } // …
Run Code Online (Sandbox Code Playgroud)

resume exception try-catch perl6 raku

9
推荐指数
3
解决办法
237
查看次数

Perl6相当于Perl的'商店'或'使用Storable'

我试图将写得非常慢的哈希写入数据文件,但我不确定Perl6与Perl5相比如何做到这一点.这是一个类似的问题在Perl 6中的文件中存储中间数据,但我不知道如何使用那里写的任何东西,特别是messagepack.

我想看看Perl6相当于

my %hash = ( 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
use Storable;
store \%hash, 'hash.pldata';
Run Code Online (Sandbox Code Playgroud)

然后阅读

my $hashref = retrieve('hash.pldata');
my %hash = %{ $hashref };
Run Code Online (Sandbox Code Playgroud)

这是内置于Perl5,它非常简单,我不需要安装任何模块(我喜欢它!),但我怎么能在Perl6中做到这一点?我在手册中没有看到它.他们似乎在用https://docs.perl6.org/routine/STORE谈论其他事情STORE

perl6 raku

9
推荐指数
1
解决办法
159
查看次数

从语法中提取标记

今年我一直在研究Perl6中的代码问题,并试图用语法来解析第3天的输入.

给出这种形式的输入:#1 @ 1,3: 4x4和我创建的这个语法:

grammar Claim {
  token TOP {
    '#' <id> \s* '@' \s* <coordinates> ':' \s* <dimensions>
  }

  token digits {
    <digit>+
  }

  token id {
    <digits>
  }

  token coordinates {
    <digits> ',' <digits>
  }

  token dimensions {
    <digits> 'x' <digits>
  }
}

say Claim.parse('#1 @ 1,3: 4x4');
Run Code Online (Sandbox Code Playgroud)

我有兴趣从坐标中提取匹配的实际标记,即id,x + y,以及从结果解析的维度中提取高度+宽度.我知道我可以将它们从生成的Match对象中拉出来Claim.parse(<input>),但我必须深入研究每个语法生成以获得我需要的值,例如

say $match<id>.hash<digits>.<digit>;
Run Code Online (Sandbox Code Playgroud)

这看起来有点乱,是否有更好的方法?

grammar extract abstract-syntax-tree parse-tree raku

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

使用Perl 6中的另一个数组的元素过滤数组的元素

我想过滤以以下元素@array开头的元素@search:

my @array = "aaaaa" .. "fffff";
my @search = "aaaa" .. "cccc";
.put for @array .grep: /^ @search /;
Run Code Online (Sandbox Code Playgroud)

问题是需要19秒.所以,我"预编译"regexgrep,整个程序是这样的:

my @array = "aaaaa" .. "fffff";
my @search = "aaaa" .. "cccc";

my $search = "/@search.join('|')/".EVAL;

.put for @array .grep: * ~~ /^ <$search> /;
Run Code Online (Sandbox Code Playgroud)

现在需要0.444秒.

问题:是否有内置的Perl 6方法来做这些事情?像插入junction一个regex......

perl6 raku

6
推荐指数
1
解决办法
386
查看次数