如何对2-D数组的哈希进行排序(简单示例)

时间:2015-10-16 18:24:43

标签: arrays perl sorting hash

我有以下哈希,DIRECTORY_NAMES作为键,2-D数组作为数据(文件的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)如何通过文件名然后按文件大小排序%hash中的数据,而不管哈希键是什么?但有关目录名称的信息很重要,不能忽略,必须在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)如何先使用filesize然后按文件名对%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)

1 个答案:

答案 0 :(得分: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