while ( $rowref = $sth->fetchrow_hashref() ) {push @data, %{$rowref};}
Without having tested yet, I think your problem is probably here*: You dereference $rowref before pushing it into the array, and a hash used in list context will return its key/value pairs:
my $hr1 = { foo=>'bar' }; my $hr2 = { quz=>'baz' }; my @data; push @data, %{$hr1}; push @data, %{$hr2}; use Data::Dump; dd @data; # ("foo", "bar", "quz", "baz")
Maybe you just want to push @data, $rowref; instead?
You might also be interested in DBI's fetchall_* methods?
* Update: Also here:
%row = $data[0]; ... foreach %row (@data)
These won't do what you expect. I think you want @data to be an array of hashes, which means that the elements of @data will contain references to hashes. You can't just assign a hashref to a hash†, you need to either de-reference the hashref (e.g. my %hash = %{$hashref};, which is a bit expensive as it copies everything), or work with the hashref directly, e.g. $hashref->{key}.
I would strongly recommend having a look at perlreftut, perldsc, and perlref. Also, if you're not doing so already, Use strict and warnings!
† Newer versions of Perl have an experimental feature called refaliasing.
In reply to Re: Array of Hashes (updated)
by haukex
in thread Array of Hashes
by Ken_M
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |