in reply to Passing an array of hashes to a subroutine

Three problems.

First, $d doesn't contain what you think it does, whatever that is.

foreach my $d (@{$array_of_hashes}) { print $d[0]{'one1'}; }

It contains the element at each index of the array (in turn). In other words, it contains a reference to a hash. Fix:

foreach my $h (@{$array_of_hashes}) { print $h->{'one1'}; }

Secondly, you reference the array @array_of_hashes even though no such array exists.

print $array_of_hashes[0]{'one1'}; print $array_of_hashes[0]{'one2'}; print $array_of_hashes[1]{'two1'}; print $array_of_hashes[1]{'two2'};

Had you used use strict as you should, you would have gotten an error. Fix:

print $array_of_hashes->[0]{'one1'}; print $array_of_hashes->[0]{'one2'}; print $array_of_hashes->[1]{'two1'}; print $array_of_hashes->[1]{'two2'};

See References Quick Reference.

Finally, your array contains two references to the same hash.

my %hash; my @array; ... push @array, \%hash; ... push @array, \%hash;

Fix:

my @array; { my %hash; ... push @array, \%hash; } { my %hash; ... push @array, \%hash; }

Replies are listed 'Best First'.
Re^2: Passing an array of hashes to a subroutine
by blazar (Canon) on May 21, 2007 at 22:01 UTC

    Fix:

    my @array; { my %hash; ... push @array, \%hash; } { my %hash; ... push @array, \%hash; }

    Or:

    my @array; my %hash; # ... push @array, { %hash }; # ... push @array, { %hash };

      No, not quite. You would need to add something to clear the hash after it's pushed.

      my @array; my %hash; # ... push @array, { %hash }; %hash = (); # ... push @array, { %hash };

      But I don't like it. Since the natural progression is a loop, you've just advocated the following:

      my @array; my %hash; for (...) { %hash = (); # ... push @array, { %hash }; }

      I much prefer the following:

      my @array; for (...) { my %hash; # ... push @array, { %hash }; }
        No, not quite. You would need to add something to clear the hash after it's pushed.

        Not necessarily: one may want to clear it, or to modify some entries. Who knows?

        my @array; my %hash=(foo => 2, bar =>3); for (1..4) { push @array, {%hash}; %hash=(%hash, map { +"$_^2" => $hash{$_}**2 } keys %hash); }
        Since the natural progression is a loop, you've just advocated the following:

        I hadn't understood we were talking about a loop, in which case you're perfectly right, and I never imagined of having advocate what you claim I did.