2015-10-16 116 views
0

我使用DIRECTORY_NAMES作爲關鍵字,並將二維數組作爲數據(文件的filenamesize)進行以下哈希處理。如何對二維數組的哈希進行排序(簡單示例)

$hash{'DIRECTORY_NAME'} = [ 
          ['filename.txt', 1024] 
          ]; 

它看起來是這樣的:

Valid XHTML

這裏是我的代碼:

use strict; 
use warnings; 
use Data::Dumper; 

my %hash = (
    'DIR_XYZ' => [ 
        [ 
        'filename_xyz.log', 
        2048 
        ], 
        [ 
        'filename_abc.txt', 
        1024 
        ] 
       ], 
    'DIR_ABC' => [ 
        [ 
        'filename_987.log', 
        4096 
        ], 
        [ 
        'filename_123.txt', 
        2048 
        ] 
       ], 
); 
$hash{'DIRECTORY_NAME'} = [ 
          ['filename.txt', 1024] 
          ]; 

print Dumper \%hash; 

我的問題:

1)如何對數據進行排序f。%hash f首先通過文件名然後通過文件大小和無論哈希鍵?但是有關目錄名稱的信息很重要,不能被忽略,並且必須在otutput上發生。因此,輸出應該是這樣的:

filename.txt  1024 (DIRECTORY_NAME) 
filename_123.txt 2048 (DIR_ABC) 
filename_987.log 4096 (DIR_ABC) 
filename_abc.txt 1024 (DIR_XYZ) 
filename_xyz.log 2048 (DIR_XYZ) 

2)如何然後通過文件名,並沒有哈希鍵此事最早由文件大小在%hash數據進行排序?但是有關目錄名稱的信息很重要,不能被忽略,並且必須在otutput上發生。所以,輸出應該看起來像這樣:

filename.txt  1024 (DIRECTORY_NAME) 
filename_abc.txt 1024 (DIR_XYZ) 
filename_123.txt 2048 (DIR_ABC) 
filename_xyz.log 2048 (DIR_XYZ) 
filename_987.log 4096 (DIR_ABC) 
+0

你嘗試過什麼嗎? – melpomene

+0

您無法對散列進行排序。唯一可以排序的是列表,因此第1步應該考慮您想要排序的列表。 – melpomene

回答

3

正如melpomene所說,你不能對散列進行排序。唯一可以排序的是列表,因此第1步應該考慮您想要排序的列表。

在這種情況下,輸出是一個列表,其中包含我們需要排序的所有信息,因此我們首先收集我們需要輸出的信息,然後應該很容易進行排序。

具體地,讓我們產生

[ 'DIR_XYZ',  'filename_xyz.log', 2048 ], 
[ 'DIR_XYZ',  'filename_abc.txt', 1024 ], 
[ 'DIR_ABC',  'filename_987.log', 4096 ], 
[ 'DIR_ABC',  'filename_123.txt', 2048 ], 
[ 'DIRECTORY_NAME', 'filename.txt',  1024 ], 

這可以如下進行:

my @files = map { [ $_, @{ $hash{$_} } ] } keys(%hash); 

在第一階排序的@files的元素:

sort { $a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] } @files 

排序的元素@files第二順序:

sort { $a->[2] <=> $b->[2] || $a->[1] cmp $b->[1] } @files 
+0

感謝您的回答和代碼,但有關'DIRECTORY_NAME'(散列鍵)的信息對我很重要,所以我很少編輯我的兩個問題。 – Scottie

+0

調整了我對問題所做更改的回答。 – ikegami

相關問題