... # group arrays by person+id my %persons; for my $aref (@$array_ref_x) { my $uniq_key = "$aref->[0] $aref->[1]"; push @{$persons{$uniq_key}}, $aref; } my $all_val = []; for my $aref_person (values %persons) { push @$all_val, my $tmp = []; for my $aref (@$aref_person) { @$tmp[0..1] = @$aref[0..1]; for my $i (2..$#$aref) { $tmp->[$i] = 0 unless defined $tmp->[$i]; $tmp->[$i] = $aref->[$i] if $aref->[$i] > $tmp->[$i]; } } } print Dumper $all_val; __END__ $VAR1 = [ [ 'John Day', '456789', 2011, '50.00', 817, 4, 22, 90 ], [ 'ALICE WONDER', '9876543', 2009, '15.00', 717, 20, 5, 11 ], [ 'Mary Ann', '123988', 2002, '10.00', 119, 5, 3, 0 ] ];