Tri de hash un peu difficile

Le
ctobini
Bonjour,

J'ai un hash :

my %h;

$h{'un'}{'start'} = 2000;
$h{'un'}{'stop'} = 3000;
$h{'deux'}{'start'} = 1000;
$h{'deux'}{'stop'} = 1500;

Je voudrais trier ce tableau selon les valeurs de 'start' :

foreach my $k (sort {} keys %h) { }

Mais je m'emmèles les pinceaux avec le sort, je n'arrive pas à
renvoyer la clé, j'ai tenté avec map() mais ça ne fonctionne pas.

Pour l'exemple de hachage, je voudrais donc avoir 'deux' et 'un'.

Auriez-vous une idée là-dessus ?

En vous remerciant,

C. Tobini
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jogo
Le #766083
Sur fr.comp.lang.perl, ctobini disait :

$h{'un'}{'start'} = 2000;
$h{'un'}{'stop'} = 3000;
$h{'deux'}{'start'} = 1000;
$h{'deux'}{'stop'} = 1500;

Je voudrais trier ce tableau selon les valeurs de 'start' :

foreach my $k (sort {} keys %h) { ... }


Pas testé mais ça devrait faire l'affaire :

for my $k (sort {$h{$a}{'start'} <=> $h{$b}{'start'}} keys %h) {

--
À vrai dire, on ne devrait nommer art que le produit de la liberté,
c'est à dire d'un vouloir qui fonde ses actes sur la raison.
-- Kant

ctobini
Le #785152
Bonjour et merci de la réponse,

Ca marche impeccablement !

Merci encore et bonne journée,

C. Tobini

On 13 fév, 12:57, Jogo
Sur fr.comp.lang.perl, ctobini disait :

$h{'un'}{'start'} = 2000;
$h{'un'}{'stop'} = 3000;
$h{'deux'}{'start'} = 1000;
$h{'deux'}{'stop'} = 1500;

Je voudrais trier ce tableau selon les valeurs de 'start' :

foreach my $k (sort {} keys %h) { ... }


Pas testé mais ça devrait faire l'affaire :

for my $k (sort {$h{$a}{'start'} <=> $h{$b}{'start'}} keys %h) {

--
À vrai dire, on ne devrait nommer art que le produit de la liberté,
c'est à dire d'un vouloir qui fonde ses actes sur la raison.
-- Kant



Paul Gaborit
Le #831779
Allez... Juste mes deux centimes de plus...

À (at) Wed, 13 Feb 2008 12:57:18 +0100,
Jogo
Sur fr.comp.lang.perl, ctobini disait :

$h{'un'}{'start'} = 2000;
$h{'un'}{'stop'} = 3000;
$h{'deux'}{'start'} = 1000;
$h{'deux'}{'stop'} = 1500;



Qu'on peut écrire plus agréablement :

%h = (
un => {start => 2000, stop => 3000},
deux => {start => 1000, stop => 1500},
);

Et hop ! Un centime !

$h{'un'}{'start'} = 2000;
$h{'un'}{'stop'} = 3000;
$h{'deux'}{'start'} = 1000;
$h{'deux'}{'stop'} = 1500;




Je voudrais trier ce tableau selon les valeurs de 'start' :

foreach my $k (sort {} keys %h) { ... }


Pas testé mais ça devrait faire l'affaire :

for my $k (sort {$h{$a}{'start'} <=> $h{$b}{'start'}} keys %h) {


Qu'on peut écrire plus simplement :

for my $k (sort {$h{$a}{start} <=> $h{$b}{start}} keys %h) {
...
}

Et hop ! Deux centimes ! ;-)

Juste pour dire qu'un mot simple (un bareword) peut s'utiliser comme
clé de hachage sans alourdire le style avec les "" ou les '' (à la
condition que Perl sache qu'à cette endroit, ça ne peut être qu'une
clé de hachage).

--
Paul Gaborit - Perl en français -

Publicité
Poster une réponse
Anonyme