my @look = ; my @out = sort { (split '\|', $a, 12)[4] <=> (split '\|', $b, 12)[4] } @look; foreach my $line (@out) { print $line; } __DATA__ accred|143|0|0|412|0|0|0|0|0|0|0|0| accu-b|36|0|0|103|0|38|0|0|0|0|2|0| accua|35|0|0|27|0|37|0|0|0|0|1|0| [...] #### ## tested my @out = map { substr $_, 6 } ## hardcoded "6" here... sort map { my $val = (split /\|/)[4]; sprintf "%06d$_",$val } ## ... and here ; #### my @d = ; my @e; my @key = map { (split /\|/)[4] } @d; 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 { @e = @d[ sort { $key[$a] <=> $key[$b] } 0 .. @d - 1 ]; }, }); #### Rate raw grt ambrus raw 2742/s -- -58% -92% grt 6547/s 139% -- -80% ambrus 33058/s 1106% 405% --