Use the Schwartz transform :
my @raw_stack = ( '900244~dfasdf~ddd3', '900122~dfasdf~ddd1', '900244~dfasdf~ddd2', '900456~dfasdf~ddd4', '900312~dfasdf~ddd3', '900456~dfasdf~ddd5', ); my @sorted = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [$_, (split/~/)[0]] } @raw_stack; dump@sorted ;
Benchmark:
#!/usr/bin/perl use 5.010; use strict; use warnings; use Benchmark qw(:all); my $s = '~dfasdf~ddd3'; my @arr = (); for(0..20000) { push @arr, int(rand(100000)) . $s; } my $count = -3; cmpthese($count, { 'ST' => sub { my @sorted = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [$_, (split/~/)[0]] } @arr; }, 'SORT' => sub { my @sorted = sort { my ($a_0) = split /~/, $a; my ($b_0) = split /~/, $b; $a_0 <=> $b_0 } @arr; }, });
result:
an array of 200 elements:
Rate SORT ST SORT 267/s -- -61% ST 689/s 158% --
an array of 2000 elements:
Rate SORT ST SORT 18.0/s -- -71% ST 61.5/s 242% --
an array of 20,000 elements:
Rate SORT ST SORT 1.35/s -- -73% ST 4.96/s 266% --
source share