my $allusers = [ { 'user' => 'Sarah', 'duration' => 2, 'amount' => 200 }, { 'user' => 'William', 'duration' => 1, 'amount' => 100 }, { 'user' => 'Michael', 'duration' => 3, 'amount' => 300 }, { 'user' => 'Michael', 'duration' => 3, 'amount' => 300 }, { 'user' => 'William', 'duration' => 7, 'amount' => 700 }, { 'user' => 'Sarah', 'duration' => 5, 'amount' => 500 } ]; #### $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'}; } } #### my $allkeys; for ( @{ $allusers } ) { my $user = $_->{'user'}; if ( !exists $allkeys->{$user} ) { my $attributes = { 'amount' => $_->{'amount'}, 'duration' => $_->{'duration'} }; $allkeys->{$user} = $attributes; } else { my $refAttributes = $allkeys->{$user}; $refAttributes->{'amount'} += $_->{'amount'}; $refAttributes->{'duration'} += $_->{'duration'}; } } my $finalArray; while ((my $key, my $value) = each %{$allkeys}) { my $hash = { 'user' => $key, 'amount' => $value->{'amount'}, 'duration' => $value->{'duration'} }; push @{$finalArray}, $hash; } #### print Dumper ($finalArray); $VAR1 = [ { 'amount' => 600, 'user' => 'Michael', 'duration' => 6 }, { 'amount' => 800, 'user' => 'William', 'duration' => 8 }, { 'amount' => 700, 'user' => 'Sarah', 'duration' => 7 } ];