我有以下哈希,DIRECTORY_NAMES
作为键,2-D数组作为数据(文件的filename
和size
)。
$hash{'DIRECTORY_NAME'} = [
['filename.txt', 1024]
];
它看起来像这样:
这是我的代码:
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)
答案 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