2013-03-07 38 views
0

文件的排序陣列我有這個陣列的文件看起來像這樣:映射和在Perl

my @html_pages_files = ("html.17", "html.9", "html.0", "html.10"); 

我會把文件的擴展名的分類部分之後。基本上文件名將是/html.\d/。事情是我想要使用映射和排序功能對它進行排序:

map { $_->[1] } 
    sort { $a->[0] <=> $b->[0] } 
    map { /html\.(.*)/; [$1, $_] } 
     @html_pages_files; 
print "@html_pages_files\n"; 

但是,輸出仍然與原始數組相同。我一直按照@Chas的步驟。歐文斯在這裏回答:Using Perl, how can I sort an array using the value of a number inside each array element?。請注意,我對Perl很新,所以我沒有得到所有的細節。

有沒有人種下錯誤的地方? 謝謝!!!

+1

其一,你不檢查,看看是否能映射塊內的正則表達式匹配成功。現在,如果由於某種原因不匹配,您將永遠不會知道它,'$ 1'將具有前一個正則表達式匹配的值。如果你期望它會一直通過的話,我會把它改成'/.../或死掉。 – 2013-03-07 16:58:43

回答

4

您的排序邏輯看起來正確,但您並未將操作結果分配給任何內容,因此您不會更改@html_pages_files。嘗試

@html_pages_files = map {$_->[1] } 
        sort {$a->[0] <=> $b->[0]} 
        map {/html\.(.*)/; [$1, $_]} @html_pages_files; 
+0

我懂了。其實你必須創建一個知道數組才能工作,它看起來像這樣: my @sorted = map {$ _-> [1]} sort {$ a - > [0] <=> $ b-> [0]} map {/ html \。(。*)/; [$ 1,$ _]} @html_pages_files; 不過謝謝你的建議! – user2007958 2013-03-07 17:08:20

+0

@ user2007958,你可以,但你沒有,因爲我們都已經表明過了。 – ikegami 2013-03-08 07:12:13

6

您從不保存排序結果!

@html_pages_files = 
    map { $_->[0] } 
    sort { $a->[1] <=> $b->[1] } 
    map { /html\.(.*)/; [$_, $1] } 
     @html_pages_files; 

(爲了保持一致性,我總是把整個字符串數組的第一個元素。)

+0

對答案中的最後一個註釋+1。 – 2013-03-07 17:04:50