Posterous theme by Cory Watilo

Filed under: ссылки

Perl, Ссылки и хеши.

На днях столкнулся с интересной задачей.

Есть ссылка на хеш:

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 [info]_kleptos_
Original post http://sharifulin.livejournal.com/7380.html