您误解了 Perl 6 语言。
(这是可以理解的,不是第一次)
以下是您尝试使用的功能的简要历史课程。
在 Perl 5 中,如果 {} 之间的唯一内容是空词,则不必引用密钥。
use v5.12;
my %hash;
$hash{fubar} = 'abc';
# $hash{'fubar'} = 'abc';
say qq'"@{[ $hash{fubar} ]}"';
# "abc"
这是一个特例,Perl 6 设计的目标之一是尽可能少地包含特例。因此,以下内容在 Perl 6 中不起作用。
use v6.d;
my %hash;
%hash{fubar} = 'abc';
# %hash{ fubar() } = 'abc';
say qq'"%hash{fubar}"';
# say qq'"%hash{ fubar() }"';
===SORRY!=== Error while compiling ./test.p6
Undeclared routine:
fubar used at lines 4, 7
这个错误意味着它甚至无法编译。
在两种 Perl 语言中都有一个引用单词的功能。
use v5;
my @array = qw< a b c d >;
use v6;
my @array = qw< a b c d >;
在 Perl 6 中可以缩短为
use v6;
my @array = < a b c d >;
qw 在 Perl 6 中实际上是 Q :q :w / Q :single :words 的缩写。它启用单引号行为并启用拆分为单词。 (按空格分割)
(<> 有效,因为那里不需要中缀运算符 <。)
为了弥补{}之间的自动裸词引用没有被复制,添加了后缀<>。它结合了qw 和{} 的特性。
use v6;
my %hash;
%hash{qw< foo bar baz >};
%hash{ < foo bar baz >};
%hash< foo bar baz >; # <---
Perl 6 中还有一个更高级的引号功能
use v6;
my $a = 'a b "c d"';
say qqww<< $a e f 'g h ' '$a'>>.perl;
say << $a e f 'g h ' '$a'>>.perl;
say « $a e f 'g h ' '$a' ».perl;
# All 3 are exactly equivalent
# ("a", "b", "c d", "e", "f", "g h ", "\$a")
qqww 是 Q :qq :ww / Q :double :quotewords 的缩写。即启用双引号行为并启用引号分词。
:double 是启用 $a 插值的原因。
:quotewords 拆分空格上的单词,但也允许引号控制拆分的位置。
(注意:quotewords 发生在最后)
(qqw 和 qww 也可以,但没有缩短的写法。)
还有一个后缀<<>>/«»。
use v6;
my %hash;
my $a = 'a b "c d "';
%hash{<< $a e f 'g h ' '$a' >>};
%hash<< $a e f 'g h ' '$a' >>;
%hash« $a e f 'g h ' '$a' »;
# All 3 are exactly equivalent to
%hash{'a', 'b', 'c d ', 'e', 'f', 'g h ', '$a'};
# ^^^^^^ ^^^^^^
这种方式使得后缀<> 不是一个特殊情况。
很多示例使用 %hash<fubar> 的原因是它是惯用的 Perl 6。
也许它应该被视为文档中的一个更高级的功能并且减少了使用,因为到目前为止你不是第一个犯这个错误的人。