[1,2]
внутри %h{[1,2]} = [3,4]
интерпретируется как срез. Поэтому он пытается присвоить %h{1}
и %{2}
. А так как ключ должен быть Array
, это плохо проверяет тип. Вот что говорит вам сообщение об ошибке.
Если вы детализируете массив, он «работает»:
my %h{Array};
%h{ $[1,2] } = [3,4];
say %h.perl; # (my Any %{Array} = ([1, 2]) => $[3, 4])
Однако это, вероятно, не дает того, что вы хотите, потому что:
say %h{ $[1,2] }; # (Any)
Это потому, что хеши объектов используют значение метода .WHICH
в качестве ключа в базовом массиве.
say [1,2].WHICH; say [1,2].WHICH;
# Array|140324137953800
# Array|140324137962312
Обратите внимание, что значения .WHICH
для этих, казалось бы, идентичных массивов различны.
Это потому, что Array
являются изменчивыми. Как и List
с, так что на самом деле это не сработает.
Так чего же вы пытаетесь достичь? Если порядок значений в массиве не важен, вы можете использовать Set
s в качестве ключей:
say [1,2].Set.WHICH; say [1,2].Set.WHICH
# Set|AEA2F4CA275C3FE01D5709F416F895F283302FA2
# Set|AEA2F4CA275C3FE01D5709F416F895F283302FA2
Обратите внимание, что эти два .WHICH
одинаковы. Так что вы можете написать это как:
my %h{Set};
dd %h{ (1,2).Set } = (3,4); # $(3, 4)
dd %h; # (my Any %{Set} = ((2,1).Set) => $(3, 4))
Надеюсь, это прояснит ситуацию. Больше информации на: https://docs.perl6.org/routine/WHICH