my @new = sort {(split /\s+/, $b)[0] <=> (split /\s+/, $a)[0]} @old; #### use Data::Dumper; use strict; use warnings; my @old = ("10.5 AA", "10.6 AA", "9 AC", "2 BB"); my $t0 = time(); for (1..200000) {#yours my @new = map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [ $_, (split( /\s+/, $_, 2 ))[0] ] } @old; } print time() - $t0, "\n"; $t0 = time(); for (1..200000) {#mine my @new = sort {(split /\s+/, $b)[0] <=> (split /\s+/, $a)[0]} @old; } print time() - $t0, "\n";