2012-03-12 3 views
-4

У меня есть программа, которая находит все файлы в каталоге и создает хэш-массив с их именами и размерами.Как отсортировать массив хэша по значению в perl?

пример

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

Я хочу, чтобы иметь возможность сортировать файлы по размеру нисходящих и добавить имена/значения в новый массив.

пример

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

Я нашел много способов сортировки массива по значению, а затем напечатать значения, но это не то, что я хочу.

+1

Это не имеет смысла. Хэши по сути неотсортированы. Ваши '% файлов' и'% filesSorted' эквивалентны; вы получите тот же эффект, просто напишите '% filesSorted =% files;'. – ruakh

+0

Возможный дубликат [Простой способ сортировки по значениям в хеше в perl] (http://stackoverflow.com/questions/5972224/the-simple-way-to-sort-based-on-values-in- a-hash-in-perl) –

+0

Добро пожаловать в StackOverflow. Пожалуйста, используйте поиск (или google) перед публикацией новых вопросов; многие уже спрошены и ответили. –

ответ

6

Вы должны поместить имена файлов в массив в отсортированном виде. В отличие от хешей 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"; 
} 

ВЫВОД

file2 => 30 
file1 => 10 
file3 => 5 
+0

Бородин - Исправьте вывод и код. Он должен быть нисходящим. Он должен быть 'sort {$ files {$ b} <=> $ files {$ a}} ключей% файлов;' –

+0

Выполнено. Спасибо Devendra. – Borodin

+0

Borodin- Welcome –