Наткнулся как-то в работе, не могу понять - это бага, или фича.
Моя практика говорит, что бага сидит в голове, а фича — в непонимании этой баги.
Суть в том, что я меняю значение ключа "a1" хэша, который является значением ключа "qwer" копии хэша %hash - %tash.
Э... Кто на ком стоял?
Это тем более не понятно:
Но при этом меняется аналогичное значение хэша %hash.
В другом случае, создается пара ключ-значение в хэше %hash, при изменении хеша %tash.
Давай посмотрим код...
$hash{'qwer'}{'a1'} = '10';
Запомни: в Perl нет многомерных массивов и хешей. Но можно хранить ссылку на анонимный массив или хеш.
Так правильнее и понятнее: значением является ссылка на анонимный хеш.
$hash{'qwer'} = {'a1' => '10'};
Корректное обращение:
$a = $hash{'qwer'}->{'a1'};
Опускать «стрелку» здесь нельзя. Не, можно. Опускать также допускается последующие идущие подряд стрелки при использовании ссылки:
$hashref = {'a' => 1, 'b' => 2};
$a = $hashref->{'a1'}->{'b2'}->{'c3'};
$a = $hashref->{'a1'}{'b2'}{'c3'};
Стрелка является операцией разыменованием ссылки.
%hash = ('a' => 1, 'b' => 2);
$a = $hash{'a1'}->{'b2'}->{'c3'};
$a = $hash{'a1'}{'b2'}{'c3'};
Настоятельно рекомендую начинать код с «use strict;», будет меньше сюрпризов.
Что дальше?
У тебя присвоение списком: копия помещается в %tash. А вот про ссылки ты забыл? Они то по прежнему ссылаются на анонимные хеши.
В общем, копировать в лоб можно только скаляры встроенных типов. Остальные скаляры являются явными или неявными ссылками.
Если не понятно, спрашивай.