2013-02-12 58 views
0

我有以下的数组:Perl的串联阵列排序(如何避免“隐式分离”的错误)

my @anim = ('rn4,mm8,bosTau2,canFam2,dasNov1,echTel1', 
    'rn4,mm8,oryCun1,bosTau2,canFam2,dasNov1,echTel1'); 

它包含多个字符串,每个字符串用逗号分隔。 我想要做的是根据字符串的最大成员对它们进行排序。 因此,我试图做的是这样的:

my @animsort = sort{scalar(split(",",$b)) <=> scalar(split(",",$a))} @anim; 

但它给这个错误:

Use of implicit split to @_ is deprecated at ./scripts/mycode.pl line 35 

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

+0

我刚刚看到这样的代码。数组“rn4,mm8 ...”中的各种字符串意味着什么? – gideon 2013-02-13 07:13:16

回答

6

如果 “最大的成员” 指的是最后一个,使用一个列表的片段:

my @sorted_anim = sort { 
    (split /,/, $b)[-1] cmp (split /,/, $a)[-1] 
} @anim; 

使用的Schwartzian变换:

my @sorted_anim = map $_->[0], 
    sort { $b->[1] cmp $a->[1] } 
    map [ $_, (split /,/, $_)[-1] ], 
    @anim; 

还是一个古特曼-Rosler变换:

my @sorted_anim = map /,(.*)/s, 
    sort { $b cmp $a } 
    map { (split /,/, $_)[-1] . ",$_" } 
    @anim; 

The Schwartzian Transf orm旨在通过为每个元素仅计算一次排序键来提高效率; Guttman-Rosler也更好一些,它还将分类键与全部数据(通常是分组键,其中的分类键已知长度;这里只是一个已知的分隔符)临时结合起来,这样perl将使用优化的内置在排序例程中,而不是为每个比较执行perl代码。

+0

如果我对你的意图的猜测是正确的,你的样本数据有两个元素与最后一个成员相同有点奇怪。 – ysth 2013-02-12 09:05:28

+0

对Guttman-Rosler变换+1,这是我以前没见过的。 – 2013-02-12 10:13:47

+0

@ysth通过最伟大的成员我认为@neversaint意味着与逗号分隔的元素最多的字符串。因此,将第一个schwarzian变换映射更改为map [$ _,标量(split /,/,$ _)]'业务 – andeyatz 2013-02-12 11:14:36

2

scalar()不返回“最大的字符串成员”或导致split这样做。也许你正在寻找List::Utilmaxstr

use List::Util qw(maxstr); 

my @sorted_anim = sort { 
    maxstr(split /,/, $b) cmp maxstr(split /,/, $a) 
} @anim; 
+0

'cmp',而不是'<=>' – ysth 2013-02-12 08:33:14

+0

累了....修正了 – ikegami 2013-02-12 08:36:19

2

如果您想按每个字符串中的元素数进行排序,您的代码将执行此操作。我在Perl 5.16中发布的代码没有出现任何错误。你有一个老版本的Perl? (我发现some evidence你的代码可能会在旧版本中产生错误)。

这里是另一种选择:

my @animsort = sort{(() = $b =~ /,/g) <=> (() = $a =~ /,/g)} @anim; 

这种种计数的逗号,而不是实际分裂的字符串。有趣的() =语法是为了确保正则表达式被视为在列表上下文中,所以我们可以计算匹配。

+0

或者用'$ a =〜y /,//' – ysth 2013-02-12 08:39:52

0

Regexp可以处理所有事情,或者您可以通过'无警告'删除警告;本地编译指示。

my $comma_re = qr!,!; 
my @animsort = sort{$b =~ s!$comma_re!!g <=> $a =~ s!$comma_re!!g} @anim; 
print Dumper(\@anim,\@animsort); 
+1

计算逗号问题:这实际上修改了数据删除所有的逗号。使用'((= = b =〜/ $ comma_re/g)'更好,即使它很丑。 – 2013-02-12 09:47:11