#!/usr/bin/perl use strict; use warnings; my @AoH = ({qw/ targetL foisonnement origin AMG count 1 /}, {qw/ targetL foisonnement origin IDBR count 1 /}, {qw/ origin IWWF targetL gonfler count 1 /}, {qw/ origin IWWF targetL due count 1 /}, {qw/ origin IWWF targetL due count 1 /}); my @AoHfinal = ({'targetL' => 'foisonnement', 'origin' => 'AMG IDBR', 'count' => '2'}, {'targetL' => 'gonfler', 'origin' => 'IWWF', 'count' => '1'}, {'targetL' => 'due', 'origin' => 'IWWF', 'count' => '2'}); my %out = (); my %seen = (); my @out = (); foreach (@AoH) { if ($out{$_->{targetL}}) { push @{$out{$_->{targetL}}->{origin}}, $_->{origin} unless $seen{$_->{targetL}}{$_->{origin}}++; $out{$_->{targetL}}{count} += $_->{count}; } else { my $row = {targetL => $_->{targetL}, origin => [$_->{origin}], count => $_->{count}}; $out{$_->{targetL}} = $row; push @out, $row; $seen{$_->{targetL}}{$_->{origin}} = 1; } } $_->{origin} = join(' ', @{$_->{origin}}) for @out; use Test::More; is_deeply(\@out, \@AoHfinal); done_testing(); __END__