Как скопировать вложенный хеш
Как скопировать многоуровневый вложенный хеш (скажем, %A) в другой хеш (скажем, %B)? Я хочу убедиться, что новый хеш не содержит те же ссылки (указатели), что и исходный хеш (% A).
Если я изменю что-либо в исходном хеше (% A), это не должно ничего менять в новом хеше (%B).
Я хочу общий способ сделать это. Я знаю, что могу сделать это путем переназначения по значению для каждого уровня ключей (например, %{ $b{kb} } = %a;).
Но должно быть решение, которое будет работать независимо от количества ключевых уровней (хэш хеш хэш.... хэш хэш)
ПРИМЕР ПРОБЛЕМЫ
use Data::Dumper;
my %a=(q=>{
q1=>1,
q2=>2,
},
w=>2);
my %b;
my %c;
%{ $b{kb} } = %a;
print "\%b=[".Data::Dumper::Dumper (%b)."] ";
%{ $c{kc} } = %a; # $b{kb} = \%a;
print "\n\%c=[".Data::Dumper::Dumper (%c)."] ";
# CHANGE THE VALUE OF KEY IN ORIGINAL HASH %a
$a{q}{q1} = 2; # $c{kc} = \%a;
print "\n\%b=[".Data::Dumper::Dumper (%b)."] ";
print "\n\%c=[".Data::Dumper::Dumper (%c)."] ";
Ценю твою помощь
1 ответ
Решение
То, что вы хотите, обычно называют "глубокой копией", где оператор присваивания делает "мелкую копию".
use Storable qw( dclone );
my $copy = dclone($src);