Причина, по которой вы видите ошибку при использовании строки в качестве хеш-ссылки, заключается в том, что вы используете неправильный оператор. |=
означает «побитовый или назначить». Другими словами,
$foo |= $bar;
совпадает с
$foo = $foo | $bar
В вашем примере происходит то, что ваша новая анонимная хеш-ссылка становится строковой, а затем побитовым ИЛИ со значением $myhash{$key}
. Чтобы еще больше запутать ситуацию, если $myhash{$key}
не определено в то время, значение представляет собой простую строковую ссылку на хеш-ссылку, которая выглядит как HASH(0x80fc284)
. Поэтому, если вы проведете краткий осмотр структуры, она может выглядеть как ссылка на хеш, но это не так. Вот несколько полезных выводов через Data::Dumper
:
perl -MData::Dumper -le '$hash{foo} |= { }; print Dumper \%hash'
$VAR1 = {
'foo' => 'HASH(0x80fc284)'
};
А вот что вы получаете, когда используете правильный оператор:
perl -MData::Dumper -le '$hash{foo} ||= { }; print Dumper \%hash'
$VAR1 = {
'foo' => {}
};