How to merge an array of hashes overriding by the latest?

Viewed 43

As per @choroba I tried the following code:

use Data::Dumper;

my @arrayofhashes = [
    {
        'a' => 4,
        'b' => 3
    },
    {
        'c' => 5,
        'a' => 2
    }

];

my %merged;
@merged{ keys %$_ } = values %$_ for @arrayofhashes;

print Dumper \%merged;

That is supposed to dump:

$VAR1 = {
          'a' => 2,
          'b' => 3,
          'c' => 5,
        };

But is instead failing with:

"Not a HASH reference"

Thanks again.

1 Answers
my %merged;
@merged{ keys %$_ } = values %$_ for @array;

For deeper hashes, see Hash::Merge.

Update: in your case, your array contains just a single element, an array reference. So you need

@merged{ keys %$_ } = values %$_ for @{ $array[0] };

instead. Or better, drop the unnecessary level:

my @arrayofhashes = (  # <-- Round bracket!
    {
        'a' => 4,
        'b' => 3
    },
    {
        'c' => 5,
        'a' => 2
    }
);
Related