2013-02-12 24 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