2015-10-16 119 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

相关问题