use List::Util qw{ first }; sub subDiscarder { my @top3 = map [0, 0, -inf], 0 .. 2; for my $minion (@{ $_[0] }) { next if $minion->[2] < $top3[2][2]; my $idx = first { $top3[$_][2] <= $minion->[2] } 0 .. 2; splice @top3, $idx, 0, $minion; splice @top3, 3; } @{ $_[0] } = @top3; }