是否有一种简单的方法可以将定义常量的值用作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)
但这似乎有点笨重.我想知道是否有更好的方法?
我想创建一个返回a Range或any 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?
想到我已经包括了
Any.但是,如果有一个人可以想到的更简单的方法.
我一直在尝试编写一个执行以下逻辑的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) 我试图将写得非常慢的哈希写入数据文件,但我不确定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中的代码问题,并试图用语法来解析第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)
这看起来有点乱,是否有更好的方法?
我想过滤以以下元素@array开头的元素@search:
my @array = "aaaaa" .. "fffff";
my @search = "aaaa" .. "cccc";
.put for @array .grep: /^ @search /;
Run Code Online (Sandbox Code Playgroud)
问题是需要19秒.所以,我"预编译"的regex对grep,整个程序是这样的:
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......