use strict; use warnings; use Data::Dump qw/pp dd/; my @sorted_data = ( { 'count_payment' => '', 'count_banking' => '31 (62.00)', 'name' => 'Parking Eye [LTD] One', }, { 'count_payment' => '10 (144.00)', 'count_banking' => '', 'name' => 'Parking Eye [LTD] Two', }, { 'count_payment' => '2 (80.42)', 'count_banking' => '', 'name' => 'Parking Eye [LTD] Three', }, { 'count_payment' => '', 'count_banking' => '4 (982.00)', 'name' => 'Parking Eye [LTD] Two', } ); my %tmp; my $order = 0; for my $record (@sorted_data) { my $target = \ $tmp{$record->{name}}; $$target->{name} = $record->{name}; $$target->{_order} //= $order++; for (qw/count_banking count_payment/){ $$target->{$_} .= $record->{$_}; } } my @new_sorted_data = sort { $a->{_order} <=> $b->{_order} } values %tmp; delete $_->{_order} for @new_sorted_data; pp \@new_sorted_data; #### -*- mode: compilation; default-directory: "d:/exp/" -*- Compilation started at Tue Jul 14 11:51:06 C:/Perl_524/bin\perl.exe -w d:/exp/pm_hash_join.pl [ { count_banking => "31 (62.00)", count_payment => "", name => "Parking Eye [LTD] One", }, { count_banking => "4 (982.00)", count_payment => "10 (144.00)", name => "Parking Eye [LTD] Two", }, { count_banking => "", count_payment => "2 (80.42)", name => "Parking Eye [LTD] Three", }, ] Compilation finished at Tue Jul 14 11:51:07