in reply to Array of Hashes

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.

Replies are listed 'Best First'.
Re^2: Array of Hashes (updated)
by Ken_M (Initiate) on Feb 07, 2019 at 14:02 UTC

    Thanks - pushing the ref did what I need. I was just trying to dereference too early.

    Yes, I am using stricy and warnings, but failed to look at the error log.