Perl内联数组排序(如何避免'隐式拆分'错误)

nev*_*int 0 unix sorting perl

我有以下数组:

  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)

这样做的正确方法是什么?

yst*_*sth 6

如果"最大成员"表示最后一个,请使用列表切片:

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代码.