2015-09-28 266 views
-2

好的,這裏有一項任務:取一個平面數據文件並根據數組中某個元素的數值排序內容,然後按字母順序排序(同時保留降序數值排序順序)。perl - 按數字順序降序排列,然後按字母順序排列

數據文件是這樣的:

data1*oranges*3 
data2*zebras*23 
data3*apples*456 
data4*pears*2 
data5*orangutans*3 
data6*peaches*1 

因此,我們要輸出爲:

data3*apples*456 
data2*zebras*23 
data1*oranges*3 
data5*orangutans*3 
data4*pears*2 
data6*peaches*1 

我在虧損,並不能真正找到任何解決我需要什麼在這裏做。我很感激在解決這個任何人的輸入。

+1

在* nix中,你可以使用'排序-t \ * -k3rn -k2,2'。 – cuonglm

回答

6

首先,將字符串分隔成你要比較的部分。然後,比較部分。

my @sorted = sort { 
    my @fields_a = split /\*/, $a; 
    my @fields_b = split /\*/, $b; 
    $fields_b[2] <=> $fields_a[2] || $fields_a[1] cmp $fields_b[1] 
} @unsorted; 

少重複的工作:

my @sorted = 
    map $_->[0], 
    sort { $b->[3] <=> $a->[3] || $a->[2] cmp $b->[2] 
    map [ $_, split /\*/ ], 
    @unsorted;