2009-09-30 7 views

ответ

8

@sorted_list является массивом ссылок на отсортированные хэш-элементов:

@sorted_list = sort { $a->{'val'} <=> $b->{'val'} } values %{$unsorted_hash_ref}; 

Вы можете использовать его так:

#!/usr/bin/perl 

my $hash_ref = { 
    one => { val => 1, name => 'one' }, 
    three => { val => 3, name => 'three' }, 
    two => { val => 2, name => 'two' }, 
}; 

foreach $elem (sort { $a->{'val'} <=> $b->{'val'} } values %{$hash_ref}) { 
    print "$elem->{'val'} : $elem->{'name'}\n"; 
} 

Выход:

1 : one 
2 : two 
3 : three 
+0

Хех. Я был так поглощен проведением сортировки на основе английского текстового текста, что я не заметил раздел «val». Тем не менее, Lingua :: EN :: Words2Nums означает, что вам вообще не нужно иметь эти подразделы - вы можете выполнять сортировку только на клавишах более высокого уровня. :) – Ether

+0

Я никогда не слышал о Lingua! Очень интересно, хотя я буду использовать его когда-нибудь! – user224579

0

Хэш-таблицы Дон» t имеет какой-то конкретный порядок. Тем не менее, вы можете сортировать ключи в массиве и использовать его для перебора хэша:

my $hash_ref = { 
    one => { val => 1, name => 'one'}, 
    three => { val => 3, name => 'three'}, 
    two => { val => 2, name => 'two'}, 
}; 

use strict; 
use warnings; 
use Lingua::EN::Words2Nums; 

foreach my $key (sort { words2nums($a) <=> words2nums($b) } keys %$hash_ref) 
{ 
    # do something with $hash_ref->{$key} 
    print "processing key $key.\n"; 
} 

Вы можете определить, что вы хотите в качестве способа сортировки; см. perldoc -f sort для более подробной информации. Преобразование от порядкового численного текста к арифметическим значениям осуществляется с помощью Lingua::EN::Words2Nums (это тоже кардинальные числа).

0
use strict; 
use warnings; 

my %hash_ref = (
one => { val => 1, name => 'one' }, 
three => { val => 3, name => 'three'}, 
two => { val => 2, name => 'two' }, 
); 

foreach my $key(sort {$hash_ref{$a}{val} <=> $hash_ref{$b}{val}} keys %hash_ref) { 
my $value = $hash_ref{$key}{val}; 
my $name = $hash_ref{$key}{name}; 
print "$name -> $value\n"; 
} 

output: 
one -> 1 
two -> 2 
three -> 3 
0
#!/usr/bin/perl 


my $hash_ref = (
       one => {val => 1, name => "one"}, 
       three => {val => 3, name => "three"}, 
       two => {val => 2, name => 'two'}, 
       ); 

foreach $elem(sort {$$hash_ref{$a}{val} <=> $$hash_ref{$b}{val}} keys %$hash_ref){ 
    my $value = $hash_ref->{$elem}{val}; 
    my $name = $hash_ref->{$elem}{name}; 
    print "$name -> $value\n"; 
} 

OutPut: 
one -> 1 
two -> 2 
three -> 3