在perl中如何按值对哈希数组排序?

在perl中如何按值对哈希数组排序?,perl,Perl,我有一个程序,可以找到一个目录中的所有文件,并创建一个名称和大小的哈希数组 范例 %files = ("file1" => 10, "file2" => 30, "file3" => 5); %filesSorted = ("file2" => 30, "file1" => 10, "file3" => 5); 我希望能够按大小降序对文件进行排序,并将名称/值添加到新数组中 范例 %files = ("file1" => 10, "file2" =&

我有一个程序,可以找到一个目录中的所有文件,并创建一个名称和大小的哈希数组

范例

%files = ("file1" => 10, "file2" => 30, "file3" => 5);
%filesSorted = ("file2" => 30, "file1" => 10, "file3" => 5);
我希望能够按大小降序对文件进行排序,并将名称/值添加到新数组中

范例

%files = ("file1" => 10, "file2" => 30, "file3" => 5);
%filesSorted = ("file2" => 30, "file1" => 10, "file3" => 5);

我找到了许多方法,可以按值对数组进行排序,然后打印值,但这不是我想要的。

必须按排序顺序将文件名放入数组中。与Perl散列不同,数组是有序的,并将保留其顺序。这段代码使用您自己的数据演示了这一点

use strict;
use warnings;

my %files = (file1 => 10, file2 => 30, file3 => 5);

my @sorted = sort { $files{$b} <=> $files{$a} } keys %files;

foreach my $file (@sorted) {
  print "$file => $files{$file}\n";
}

那没有道理。散列本质上是未排序的。您的
%文件
%文件排序
是等效的;您只需编写
%filesorted=%files,就可以获得相同的效果。可能重复欢迎使用StackOverflow。在发布新问题之前,请使用搜索(或谷歌);很多问题已经被问到和回答了。请原谅一个愚蠢的问题,但是你为什么要对哈希进行排序?如果您访问单个值,比如
$files{“file1”}
它是否已排序并不重要,如果您想循环,您必须拥有键,然后更容易对键进行排序
(排序{$files{$a}$files{$b}}键%files){…}
。这在Perl FAQ.Borodin中-更正输出和代码。它应该是降序的。它应该是
排序{$files{$b}$files{$a}}键%files使用
List::UtilsBy::revsort_by
:使用List::UtilsBy qw(revsort_by),该代码也可以稍微整洁一些;我的@sorted=revsort_按{$files{$}}键%files;