On ne peut pas conserver l'ordre d'insertion pour un hash, mais on peut stocker quelque part l'information sur l'ordre d'insertion afin de la récupérer quand le besoin s'en fait sentir.
Un exemple simple, tu veux stocker des données d'une table de conversion dans un hash:
1 2 3 4
| $mois{jan} = "janvier";
$mois{feb} = "février";
$mois{mar} = "mars";
# etc. |
Il n'y a aucun moyen de réimprimer tes valeurs ou tes clefs dans l'ordre où les éléments ont été insérés (l'ordre des mois de l'année).
Mais si tu fais ceci:
1 2 3 4 5 6 7
| $mois{jan} = "janvier";
push @order, "jan";
$mois{feb} = "février";
push @order, "feb";
$mois{mar} = "mars";
push @order, "mar"
# etc. |
Il suffit de relire le tableau @order dans l'ordre pour récupérer les clefs (et donc les valeurs) dans l'ordre:
print "Le mois dont le nom abrégé est $_ a pour nom entier $mois{$_}\n" foreach @order;
Il y a d'autres moyens de stocker cette information: concaténer la valeur avec un numéro d'ordre:
1 2 3
| $mois{jan} = "01-janvier";
$mois{feb} = "02-février";
$mois{mar} = "03-mars"; |
Un simple tri sur les valeurs permettra de récupérer les choses dans l'ordre (il suffit ensuite d'éliminer le numéro d'ordre).
Autre méthode: stocker une référence sur un tableau anonyme dans chaque élément du hash:
1 2 3
| $mois{jan} = [1, "janvier"];
$mois{feb} = [2, "février"];
$mois{mar} = [3, "mars"]; |
On trie ensuite selon le premier élément du tableau de chaque élément du hash.
Partager