my %HOA; my $count = 0; foreach my $A (@$AOA) { my $key = $A->[1] . '-' . $A->[3]; if (!defined $HOA{$key}) { $HOA{$key} = [$A, $count++]; } } # Records need to be in the same sequence my @new_AOA = sort { $a->[1] <=> $b->[1] }values %HOA; @new_AOA = map {$_->[0]} @new_AOA; print Dumper \@new_AOA;