use Sort::Key 'ikeysort'; my @d = ; my @e; use Benchmark qw/cmpthese/; cmpthese (4e4, { grt => sub { @e = map { substr $_, 6 } sort map { my $val = (split /\|/)[4]; sprintf "%06d$_",$val} @d; }, raw => sub { @e = sort { (split '\|', $a, 12)[4] <=> (split '\|', $b, 12)[4] } @d; }, ambrus => sub { my @key = map { (split /\|/)[4] } @d; @e = @d[ sort { $key[$a] <=> $key[$b] } 0 .. @d - 1 ]; }, sk => sub { @e = ikeysort { (split '\|', $_, 12)[4] } @d } }); #### Rate raw grt ambrus sk raw 1887/s -- -63% -69% -74% grt 5141/s 172% -- -15% -29% ambrus 6061/s 221% 18% -- -16% sk 7246/s 284% 41% 20% --