Зачем вам нужен анонимный хеш? Хотя ответы говорят вам о различных способах создания анонимного хэша, мы не знаем, является ли какой-либо из них правильным решением для всего, что вы пытаетесь сделать.
Если вам нужна отдельная копия, которую можно изменить, не нарушая исходные данные, используйте dclone
из Storable, который поставляется с Perl. Это создает глубокую копию вашей структуры данных:
use Storable qw(dclone);
my $clone = dclone \%hash;
Рассмотрим ответ Дейва Уэбба, но с дополнительным уровнем ссылок. Значение для ключа c
является еще одной ссылкой на хэш:
use Data::Dumper;
my %original = ( a => 1, b => 2, c => { d => 1 } );
my $copy = { %original };
print
"Before change:\n\n",
Data::Dumper->Dump( [ \%original], [ qw(*original) ] ),
Data::Dumper->Dump( [ $copy ], [ qw(copy) ] ),
;
$copy->{c}{d} = 'foo';
print
"\n\nAfter change:\n\n",
Data::Dumper->Dump( [ \%original], [ qw(*original) ] ),
Data::Dumper->Dump( [ $copy ], [ qw(copy) ] ),
;
Изучив выходные данные, вы увидите, что, хотя у вас есть анонимный хэш, он все равно связан с оригиналом:
Before change:
%original = (
'c' => {
'd' => 1
},
'a' => 1,
'b' => 2
);
$copy = {
'c' => {
'd' => 1
},
'a' => 1,
'b' => 2
};
After change:
%original = (
'c' => {
'd' => 'foo'
},
'a' => 1,
'b' => 2
);
$copy = {
'c' => {
'd' => 'foo'
},
'a' => 1,
'b' => 2
};