use strict; use warnings; use Data::Dumper; my @masterArray = ( ["this", "that", 12563, "something", "else"], ["this", "that", 10, "something", "else"], ["this", "that", 1, "something", "else"], ["this", "that", 125638, "something", "else"], ["this", "that", 300000, "something", "else"], ); my @top3 = sort {$b->[2] <=> $a->[2]} @masterArray[0..2]; my $min_top = $top3[2][2]; for my $sub_aref (@masterArray [3..$#masterArray]) { next if $sub_aref <= $min_top; @top3 = (sort {$b->[2] <=> $a->[2]} @top3, $sub_aref)[0..2]; $min_top = $top3[2][2]; } print Dumper @top3; #### $ perl subdiscard.pl $VAR1 = [ 'this', 'that', 300000, 'something', 'else' ]; $VAR2 = [ 'this', 'that', 125638, 'something', 'else' ]; $VAR3 = [ 'this', 'that', 12563, 'something', 'else' ]; #### use strict; use warnings; use Data::Dumper; my $nb_elements = shift; chomp $nb_elements ; my @masterArray; push @masterArray, ["", "", int rand (1e7), ""] for 1..$nb_elements; # print Dumper \@masterArray; my @top3 = sort {$b->[2] <=> $a->[2]} @masterArray[0..2]; my $min_top = $top3[2][2]; $nb_elements--; for my $sub_aref (@masterArray [3..$nb_elements]) { next if $sub_aref->[2] <= $min_top; @top3 = (sort {$b->[2] <=> $a->[2]} @top3, $sub_aref)[0..2]; $min_top = $top3[2][2]; } print Dumper \@top3; #### $ time perl subdiscard2.pl 1000000 $VAR1 = [ [ '', '', 9999996, '' ], [ '', '', 9999993, '' ], [ '', '', 9999990, '' ] ]; real 0m2.497s user 0m2.386s sys 0m0.108s #### $ time perl subdiscard3.pl 1000000 $VAR1 = [ [ '', '', 9999980, '' ], [ '', '', 9999955, '' ], [ '', '', 9999944, '' ] ]; real 0m7.605s user 0m7.518s sys 0m0.093s