Поскольку хеш-ключ всегда является строковым, а строковое значение массива REFERENCE (которым является $test_ref
) является именно таким: "ARRAY(0x...)"
.Это отличается от Java-карт, которые могут хранить произвольный объект в качестве ключа.
Поэтому ваш хэш будет иметь 1 пару значений кет-значений, причем ключом является строка ""ARRAY(0x...)"
"
Итак, когда у вас есть цикл for
, он перебирает все ключи (все 1 из них), а затем присваивает значение ключа (строка "ARRAY(0x...)"
) переменной $key
.
Youзатем попытайтесь разыменовать массив этой строки - что, конечно, невозможно сделать, поскольку это не ссылка на массив - это просто строка, содержащая строковое представление того, что раньше было ссылкой на массив.
Если вы хотите, чтобы «24, 26, 55» были 3 хеш-ключами, вы можете сделать это:
my %new = map { $_ => 10 } @$test_ref;
Если вы действительно хотите сохранить список в хеш-ключе, это выполнимоно не всегда (в вашем случае список целых чисел вы можете, но он медленный, неуклюжий, и я не могу представить, когда вы когда-нибудь захотите.
# Trivial example:
my $test_ref = [24, 26, 55];
$new{ join(",",@$test_ref) } = 10;
foreach my $key (keys %new){
my @list = split(/,/,$key);
print $list[0];
}
Этот подход имеет некоторые потери производительностии может быть немного оптимизирован (например, путем запоминания результатов разделения). Но опять же, fили в значительной степени по ЛЮБОЙ причине, по которой вы, возможно, захотите это сделать, возможно, есть лучшие решения.