Как скопировать вложенный хеш

Как скопировать многоуровневый вложенный хеш (скажем, %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);
Другие вопросы по тегам