2013-05-20 66 views
2

我有一個散列。哈希鍵是一個很長的字符串「str_3432_123_A12_C02_xy_ut」我想按照格式爲A12_C02的字符串子集對鍵進行排序。我假設字符串的其他部分不會匹配正則表達式,但字符串內的位置可能不同。按perl字符串的子集排序

[A-Za-z][0-9]{2}_[A-Za-z][0-9]{2} 

通過按鍵

my @sorted = sort keys %myhash; 

排序我的哈希我也有所有的值可能可能匹配不同的陣列。

回答

3

使用的mapsort組合來提取要使用排序和恢復整個鍵一次完成的,像字符串的一部分:

my @sorted = 
    map { $_->[0] } 
    sort { $a->[1] cmp $b->[1] } 
    map { m/([A-Za-z][0-9]{2}_[A-Za-z][0-9]{2})/ && [$_, $1] } 
    keys %myhash; 
+0

謝謝你工作得很好。 – Jabda

+0

這是一個遲到的請求,但你能解釋第一個和第二個地圖是如何工作的嗎? – Jabda

+1

@Jabda:第一個地圖(從底部開始)提取將用於排序鍵的子字符串。它返回一個arrayref值,以便稍後使用這兩個值。第二個用在下面的'sort'中,第一個在第二個'map'中被提取。 – Birei

3

至少如果它不是一個巨大的排序,一個簡單的解決方案將直接使用sort

my $re = /([a-z][0-9]{2}_[a-z][0-9]{2})/i; 
my @sorted = sort { 
     ($a) = $a =~ $re; 
     ($b) = $b =~ $re; 
     $a cmp $b; 
    } 
    keys %hash;