На днях столкнулся с интересной задачей.
Есть ссылка на хеш:
my $hash = { 'name' => 'test', 'attr' => { 'id' => 0, },};
Нужно сделать N таких хешей, изменив только attr->id.
Сразу написал такой код:
print Dumper [ map { $hash->{'attr'}->{'id'} = $_; $hash; } 1, 2, 3, ..., N];
Но не тут-то было, получилось N-хешей, с attr->id равным последнему значению, т.е. N.
Действительно, ссылка на хеш имела один и тот же адрес HASH(0x224f94), в map'е я постоянно менял attr->id, но последующее значение затирало предыдущее, поэтому все верно получилось.
Поэтому написал такой код:
print Dumper [ map { my $h = { %$hash }; $h->{'attr'}->{'id'} = $_; $h; } 1, 2, 3, ..., N];
Но результат оказался прежним.
Изменив адрес хеша, адрес ссылки на хеш attr остался тем же.
Окончательно, получилось следующее:
print Dumper [ map { my $h = { %$hash }; $h->{'attr'} = { %{$hash->{'attr'}}, 'id' => $_}; $h; } 1, 2, 3, ..., N];
Интересное получилось решение :)
Update:
print Dumper [ map { +{ %$hash, 'attr' => { %{$hash->{'attr'}}, 'id' => $_} } } 1, 2, 3, ..., N];
спасибо за мысль избавиться от my $h
_kleptos_
Original post
http://sharifulin.livejournal.com/7380.html