我有这个数组:
@raw_stack = (
'900244~dfasdf~ddd3',
'900122~dfasdf~ddd1',
'900244~dfasdf~ddd2',
'900456~dfasdf~ddd4',
'900312~dfasdf~ddd3',
'900456~dfasdf~ddd5',
);
Run Code Online (Sandbox Code Playgroud)
我想用第一个'〜'元素对它进行排序.有没有更优雅的方法来解决这个问题,而不是循环和分裂每个值?
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;
Run Code Online (Sandbox Code Playgroud)
基准测试:
#!/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;
},
});
Run Code Online (Sandbox Code Playgroud)
结果:
200个元素的数组:
Rate SORT ST
SORT 267/s -- -61%
ST 689/s 158% --
Run Code Online (Sandbox Code Playgroud)
2000个元素的数组:
Rate SORT ST
SORT 18.0/s -- -71%
ST 61.5/s 242% --
Run Code Online (Sandbox Code Playgroud)
20000个元素的数组:
Rate SORT ST
SORT 1.35/s -- -73%
ST 4.96/s 266% --
Run Code Online (Sandbox Code Playgroud)