I think I got it. But I had to create a temp hash to build it.
use strict;
use warnings;
use Data::Dumper;
my %in_hash = (
jibber => [
{id => 1, score => 3, name => 'foo'},
{id => 5, score => 1, name => 'bar'},
{id => 22, score => 6, name => 'baz'},
],
jabber => [
{id => 3, score => 1, name => 'boo'},
{id => 5, score => 3, name => 'bar'},
{id => 12, score => 2, name => 'zib'},
{id => 22, score => 2, name => 'baz'},
],
);
my %tmp;
for my $key (keys %in_hash) {
for my $href (@{$in_hash{$key}}) {
my $id = $href->{id};
if (exists($tmp{$id})) {
$tmp{$id}->{score} += $href->{score};
}
else {
$tmp{$id} = $href;
}
$tmp{$id}->{keys}->{$key}++;
}
}
my %out_hash;
for my $id (keys %tmp) {
my $keys = $tmp{$id}->{keys};
delete $tmp{$id}->{keys};
my $new_key = join(' ', reverse sort keys %$keys);
push(@{$out_hash{$new_key}}, $tmp{$id});
}
print Dumper \%out_hash;
output...
C:\tmp>erick.pl
$VAR1 = {
'jibber' => [
{
'name' => 'foo',
'score' => 3,
'id' => 1
}
],
'jabber' => [
{
'name' => 'boo',
'score' => 1,
'id' => 3
},
{
'name' => 'zib',
'score' => 2,
'id' => 12
}
],
'jibber jabber' => [
{
'name' => 'baz',
'score' => 8,
'id' => 22
},
{
'name' => 'bar',
'score' => 4,
'id' => 5
}
]
};