in reply to Duplicate rows with Class::DBI

The problem lies here:

my %data; my @loop_data = (); ## NOT INCREMENTING PRIMARY KEY, THUS RETURNING THE FIRST ROW *TWICE* for (@info) { $data{author} = $_->author; $data{content} = $_->content; $data{title} = $_->title; $data{id} = $_->id; $data{date} = $_->date; push @loop_data, \%data; }

Your hash, %data, is defined outside the lexical block of the for-loop. At the end of the for-loop, you push a reference to %data onto @loop_data. The problem is that the next time through the loop, you modify the same %data, which is already being referenced by $loop_data[0], and push another reference to the same hash onto $loop_data[1]. Thus every element of @loop_data will be pointing to the same hash. You can fix this easily by declaring your %data hash inside the lexical block of your loop, so a new one gets created every time through the loop.

my @loop_data; for (@info) { my %data; $data{author} = $_->author; $data{content} = $_->content; $data{title} = $_->title; $data{id} = $_->id; $data{date} = $_->date; push @loop_data, \%data; }

Update: Formatting errors.

Replies are listed 'Best First'.
Re^2: Duplicate rows with Class::DBI
by stonecolddevin (Parson) on Apr 25, 2005 at 23:13 UTC
    Haha, friedo to the rescue yet again. I may have to write a perl meditation on that...;-)
    Worked like a charm, thanks very much :-)
    meh.
Re^2: Duplicate rows with Class::DBI
by eibwen (Friar) on Apr 26, 2005 at 00:37 UTC

    Presuming that you want to push all the keys onto the array:

    push @loop_data, \%$_ for (@info);

      Why the \%$_? There's no need to copy $_'s referant, simply doing push @loop_data, $_ for @info would suffice. Of course, that's exactly the same as @loop_data = @info, so the whole thing is moot anyway. :)