$allusers = [ sort { $a->{'user'} cmp $b->{'user'} } @$allusers ]; my ($temp, $grouped); my $ctr = -1; for ( @{ $allusers } ) { if ( $temp && $temp eq $_->{'user'} ) { $grouped->[$ctr]{'amount'} += $_->{'amount'}; $grouped->[$ctr]{'duration'} += $_->{'duration'}; } else { $ctr++; $temp = $grouped->[$ctr]{'user'} = $_->{'user'}; $grouped->[$ctr]{'amount'} = $_->{'amount'}; $grouped->[$ctr]{'duration'} = $_->{'duration'}; } }