Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tri de hash un peu difficile

3 réponses
Avatar
ctobini
Bonjour,

J'ai un hash :

my %h;

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

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

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

Mais je m'emm=E8les les pinceaux avec le sort, je n'arrive pas =E0
renvoyer la cl=E9, j'ai tent=E9 avec map() mais =E7a ne fonctionne pas.

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

Auriez-vous une id=E9e l=E0-dessus ?

En vous remerciant,

C. Tobini

3 réponses

Avatar
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

Avatar
ctobini
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 wrote:
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



Avatar
Paul Gaborit
Allez... Juste mes deux centimes de plus...

À (at) Wed, 13 Feb 2008 12:57:18 +0100,
Jogo écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>