in reply to Why is my code assigning the last-retrieved value to all elements in my hash?
In the code below, Init_1 seems to reproduce your problem, while Init_2 provides an alternative, properly functioning initialization.
I remember running into this earlier, and posting a very similar issue in Conquering "x" operator over-optimization. merlyn gently indicated that a "deep copy" is required in this case.
use strict; use warnings; my ($book_id , %booklist_1); Init_1(); populate_and_print(); Init_2(); populate_and_print(); #-------------------- sub populate_and_print{ foreach $book_id (keys %booklist_1) { my ($update_id, $title) = ( int (100 *rand()), "title" . int ( +1000 *rand())); $booklist_1{$book_id}{'update_id'} = $update_id; $booklist_1{$book_id}{'title'} = $title; print "$book_id > $booklist_1{$book_id}{'update_id'}\n"; } #$sth->finish; foreach $book_id (keys %booklist_1) { print "XXX $book_id > $booklist_1{$book_id}{'update_id'}\n"; } } sub Init_1{ %booklist_1=(); @booklist_1{ 100..104 } = ( { title => 'empty', update_id => 'missing' } ) x 5; } sub Init_2{ %booklist_1=(); $booklist_1{$_ } = { title => 'empty', update_id => 'missing' } for 100..104; }
Have you been high today? I see the nuns are gay! My brother yelled to me...I love you inside Ed - Benny Lava, by Buffalax
|
|---|