2009-09-30 6 views

Répondre

8

@sorted_list est un tableau de références aux éléments de hachage triés:

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

Vous pouvez l'utiliser comme ceci:

#!/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"; 
} 

Sortie:

1 : one 
2 : two 
3 : three 
+0

Heh. J'étais tellement habitué à conduire le tri basé sur le texte numérique anglais que je n'ai pas remarqué la sous-clé 'val'. Néanmoins, Lingua :: EN :: Words2Nums signifie que vous n'avez pas besoin d'avoir ces sous-clés - vous pouvez faire le tri uniquement sur les clés de plus haut niveau. :) – Ether

+0

Je n'ai jamais entendu parler de Lingua! Très intéressant cependant, je vais devoir en profiter un jour! – user224579

0

tables de hachage n » t avoir une commande spécifique. Cependant, vous pouvez trier les clés dans un tableau et l'utiliser pour itérer le hachage:

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"; 
} 

Vous pouvez définir tout ce que vous aimez comme méthode de tri; Voir perldoc -f sort pour plus de détails. La conversion d'un texte numérique ordinal en valeurs arithmétiques se fait avec Lingua::EN::Words2Nums (elle fait aussi des nombres cardinaux).

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 
Questions connexes