我正在玩Map而且我得到了一个我不理解的结果。
首先,我构建Map。没有大呐喊:
> my $m = Map.new: '1' => :1st, '2' => :2nd;
Map.new(("1" => :st(1),"2" => :nd(2)))
我通过文字键访问单个元素并返回一对:
> $m<1>.^name
Pair
> $m<<1>>.^name
Pair
一切都很好。
如果我使用变量中的键进行尝试,我会返回List而不是:
> my $n = 1
1
> $m<<$n>>.^name
List
该列表具有正确的值,但为什么在这种情况下我会得到List而不是$m<<1>>
?
而且,一旦我有了这个列表,我似乎无法将另一个下标链接到它:
> $m<<$n>>.[0]
===SORRY!=== Error while compiling:
Unable to parse quote-words subscript; couldn't find right double-angle quote
at line 2
答案 0 :(得分:3)
当您访问这样的关联值时,编译器可以告诉它只需要返回一个值。
$m< 1 >
$m<< 1 >>
在Perl 6中,奇异值在许多情况下的行为就像一个值的列表。
42.elems == 1 # True
42.[0] =:= 42 # True
在以下情况下,编译器无法立即告诉它只会产生一个值:
my $n = 1;
$m<< $n >>;
因为它可能产生2个值:
my $o = '1 2';
$m<< $o >>;
如果要将字符串作为单个键,则必须使用引号。
$m<< "$o" >>
或者使用更合适的{}
$m{ $n }
$m<1>
只是两个功能的组合。
行情词:(qw<>
和qqww<<>>
)
< a b c > eqv ("a", "b", "c")
< "a b" c > eqv (「"a」, 「b"」, "c") # three strings
<< a b c >> eqv ("a", "b", "c")
<< "a b" c >> eqv ("a b", "c") # two strings
关联索引:
%h< a b c > eqv %h{ < a b c > }
%h<< "a b" c >> eqv %h{ << "a b" c >> }
我现在也获得了不同的值。
$m< 1 >.WHAT =:= Pair
$m<< 1 >>.WHAT =:= Pair
$m<< $n >>.WHAT =:= Pair # different
$m<< $o >>.WHAT =:= List
$m<<$n>>.[0]
不起作用的原因是编译器认为您使用的是超级后缀>>.[0]
。
有几种解决方法。
实际上使用超级后缀
$m<<$n>>>>.[0]
$m<<$n>>».[0]
使用一个空格。 (永远不能在运算符内部,所以会拆分它们)
$m<<$n>>\.[0]
$m<<$n>>\ .[0]
我认为这是一个错误,因为在quotewords语句中匹配超级后缀没有多大意义。
(它不会影响$m<<1>>.elems
)