hsm*_*ers 8 hash key exists raku
在尝试调试程序代码时,我遇到了以下问题:
(base) hsmyers@BigIron:~$ rlwrap -A raku
To exit type 'exit' or '^D'
> my regex N { <[A..G]> };
regex N { <[A..G]> }
> my %h = A => 1, B => 2;
{A => 1, B => 2}
> 'B' ? %h.keys
True
> my $m = 'B' ~~ / <N> /;
?B?
N => ?B?
> $m ? %h.keys
False
> $m.Str ? %h.keys
True
> my $n = $m.Str
B
> $n ? %h.keys
True
> %h<B>:exists
True
> %h<$n>:exists
False
>
Run Code Online (Sandbox Code Playgroud)
总之,问题是你如何从匹配对象到字符串,这样 %whatever:exists 将起作用。“键元素”提供了一种解决方法,但我认为这不是检查键是否存在的正确方法?
<a b c>是 的快捷方式qw<a b c>。
最终将成为'a', 'b', 'c'
通过键访问哈希的方法是 {}
%h{'a', 'b', 'c'}
Run Code Online (Sandbox Code Playgroud)
写成这样会更好:
%h{<a b c>}
Run Code Online (Sandbox Code Playgroud)
更好的是摆脱 {}
%h<a b c>
Run Code Online (Sandbox Code Playgroud)
这就是为什么这是有效的 Raku 语法。
所以当你写这个时:
%h<$n>
Run Code Online (Sandbox Code Playgroud)
它基本上与以下相同:
%h{'$n'}
Run Code Online (Sandbox Code Playgroud)
如果您只访问一个元素,并且它没有空格。
而不是一直这样做:
%h{'abc'}
Run Code Online (Sandbox Code Playgroud)
使用它要简单得多:
%h<abc>
Run Code Online (Sandbox Code Playgroud)
这就是所有文档都使用这种形式的原因。
同样,这些也是相同的:
$/{<a b c>}
$/<a b c>
$<a b c>
Run Code Online (Sandbox Code Playgroud)
所以如果你看到$<abc>它真的在寻找$/与 key 关联的值abc。
Raku 中有很多语法重用。<>就是这样一种情况。
笔记:
您不需要.keys在 Hash 上使用?.
'B' ? %h; # True
Run Code Online (Sandbox Code Playgroud)
(由于 Raku 使用不同的运算符进行不同的操作,因此您很少需要进行此类数据按摩。)
您Str使用 ~将匹配项放入上下文中,但我认为问题在于您<>对变量使用文字引号。%h<$n>返回与文字键 $n 对应的值。您需要使用 %h{$n} 来检索与$n. 此外,如果 $n 包含 aMatch它将被放入 Str 上下文中,因此应该可以工作。