Вы неправильно поняли язык 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
- это действительно сокращение Q :q :w
/ Q :single :words
в Perl 6. Чтоэто включить поведение в одинарных кавычках и включить разбиение на слова.(разделение на пробелы)
(<>
работает, потому что там не ожидается инфиксный оператор <
.)
Чтобы компенсировать автоматическое цитирование пустого слова между {}
, которое не было скопировано,postcircumfix <>
был добавлен.Он сочетает в себе обе функции 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
isсокращение от Q :qq :ww
/ Q :double :quotewords
.Что включает в себя поведение двойных кавычек и включение разделения слов в кавычках.
:double
- это то, что позволяет интерполировать $a
.
:quotewords
, разделяет слова на пробелы, но также допускает кавычкидля контроля того, где вещи распадаются.
(обратите внимание, что :quotewords
происходит последним)
(qqw
и qww
также работают, но сокращенного способа их записи нет.)
Существует также postcircumfix <<>>
/ «»
.
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'};
# ^^^^^^ ^^^^^^
Этот тип делает это так, что postfix <>
является менее частным случаем.
Причина, по которой во многих примерах используется %hash<fubar>
, заключается в том, что это идиоматический Perl 6.
Возможно, это следует рассматривать как более продвинутую функцию в документах и ограниченное использование, потому что вы далеко непервый человек, совершивший эту ошибку.