$var = [ { 'id_a' => '1', 'id_b' => '5', 'value_x' => '10', 'value_y' => '5' }, { 'id_a' => '2', 'id_b' => '3', 'value_x' => '20', 'value_y' => '10' }, { 'id_a' => '2', 'id_b' => '3', 'value_x' => '30', 'value_y' => '20' }, { 'id_a' => '3', 'id_b' => '7', 'value_x' => '15', 'value_y' => '15' }]; my ($id, %ids, @var2); for (my $i = 0; $i <= $#$var; $i++) { $id = @$var[$i]->{'id_a'} . ' ' . @$var[$i]->{'id_b'}; if (!$ids{$id}) { push(@var2, @$var[$i]); $ids{$id} = @$var[$i]; } else { $ids{$id}->{'value_x'} += @$var[$i]->{'value_x'}; $ids{$id}->{'value_y'} += @$var[$i]->{'value_y'}; } } $var = \@var2; foreach (@$var) { print '[' . $line++ . ']' . ' id_a -> ' . $_->{'id_a'} . ' id_b -> ' . $_->{'id_b'} . ' value_x -> ' . $_->{'value_x'} . ' value_y -> ' . $_->{'value_y'} . "\n"; }