我有以下数组:
my @anim = ('rn4,mm8,bosTau2,canFam2,dasNov1,echTel1',
'rn4,mm8,oryCun1,bosTau2,canFam2,dasNov1,echTel1');
Run Code Online (Sandbox Code Playgroud)
它包含多个字符串,每个字符串都以逗号分隔.我想要做的是根据字符串中最伟大的成员对它们进行排序.因此,我试图做的是:
my @animsort = sort{scalar(split(",",$b)) <=> scalar(split(",",$a))} @anim;
Run Code Online (Sandbox Code Playgroud)
但它给出了这个错误:
Use of implicit split to @_ is deprecated at ./scripts/mycode.pl line 35
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
如果"最大成员"表示最后一个,请使用列表切片:
my @sorted_anim = sort {
(split /,/, $b)[-1] cmp (split /,/, $a)[-1]
} @anim;
Run Code Online (Sandbox Code Playgroud)
使用Schwartzian变换:
my @sorted_anim = map $_->[0],
sort { $b->[1] cmp $a->[1] }
map [ $_, (split /,/, $_)[-1] ],
@anim;
Run Code Online (Sandbox Code Playgroud)
或者Guttman-Rosler变换:
my @sorted_anim = map /,(.*)/s,
sort { $b cmp $a }
map { (split /,/, $_)[-1] . ",$_" }
@anim;
Run Code Online (Sandbox Code Playgroud)
Schwartzian变换旨在通过仅为每个元素计算一次排序键来提高效率; 格特曼 - 罗斯勒的推移也暂时结合了全部数据的排序关键字一个更好的(经常有包,其中排序关键字是已知长度的;这里只是用已知的分隔符)以这样一种方式,perl的将使用经过优化的内置-in sort例程而不是为每个比较执行perl代码.