[Perl] et oui encore du Perl ! rangement hash

Résolu/Fermé
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 10 mai 2005 à 15:10
Lamadamme Messages postés 4 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 6 avril 2010 - 24 févr. 2010 à 21:04
Une petite question qui souleve un lourd débat dans un autre forum et qui me pose probleme :
Comment fait on pour ranger un hash dans un ordre précis, car si on y met des valeurs à l'aide d'un boucle, de manière automatique, le hash met ces valeur un peu ou ca l'arrange, et donc quand on veut relire les données contenu dans le hash une à une, celle-ci ne sont plus dans l'ordre.
Je sais que fondamentalement, un hash est anarchique mais n'y a t il pas une solution à ce problème ?

merci de votre participation.
++
A voir également:

11 réponses

Salut tout le monde.
Je bien le sais que la dernier réponse était le 2005, mais peut être ça peut aider une autre personne.
Alors, si tu veux trier un hashage, tu peut definir l'ordre dans un table et imprimer selon ce table.
Par exemple:
$i=0;
@ord = qw/ 1 5 4 6 2 8 3/;
foreach $cle (keys %Hash) {
if ($cle eq $ord[$i]) {
print " $cle $Hash{$cle}\n";
$i++;
}
}
On doit être sure que tous les valeurs de @ord sont aussi dans %Hash.
Est-ce que vous avez une autre sugestion??
A+
4
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
23 févr. 2010 à 20:13
Salut,

Ton tableau n'est pas ordonné;-)
On doit être sure que tous les valeurs de @ord sont aussi dans %Hash.
Autant utiliser keys %hash pour être sûr

Est-ce que vous avez une autre sugestion??
Ce ne sont pas les façons de faire qui manquent à Perl ;-)

my @ord=sort keys %hash;
for my $cle(@ord){
    print "$cle $hash{$cle}\n";
}
ou
print "$_ $hash{$_}\n" for @ord;
ou
for my $cle(sort keys %hash){
  print "$cle $hash{$cle}\n";
}
ou
print "$_ $hash{$_}\n" for sort keys %hash;


0
m0n0-le-14r3 Messages postés 174 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 25 octobre 2005 17
10 mai 2005 à 15:13
bien... j'ai peur que peu de gens te réponde kijounours...
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
10 mai 2005 à 15:22
Ne me surnomme pas comme ca en public, tu me fait rougir...

:D
0
Vous lez voulez dans quel ordre ? Alphabétique ?
Avez vous un bout de code et/ou de ce que voulez faire ?
Ca serait plus facile pour vous aider :-)

Bzozo
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
10 mai 2005 à 20:23
Bonsoir,

Perl stocke les paires clé-valeur d'un hachage selon un ordre interne particulier. Ainsi, il ne doit pas toutes les parcourir quand il doit en trouver une. Cet ordre ne peut pas être contrôlé.

@+
0
Salut à tout le monde,

Voilà un petit pasage de livre
"Introduction à Perl" par Randal L. Schwartz & Tom Phoenix Edition O'Reilly (3ème édition) - novembre 2002.

START
"
Nous voulons afficher la liste de façon ordonnée en commençant par le gagnant; nous devons donc trier le hachage par score:

my %score= ( "barney" => 195, "fred" => 205, "dino" => 30);
my @gagnants = sort par_score keys %score;

Naturellement, nous n'allons pas pouvoir trier le hachage par score; il ne s'agit que d'un raccourci verbal. Il n'est pas possible de trier un hachage!.......................................................................................................................

sub par_score { $score{$b} <=> $score{$a} }
..............
"
FIN


On peut écrire

foreach $cle (sort keys %HASH {
print $cle, '=', $HASH{$cle}, "\n";
}

A+
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
11 mai 2005 à 10:08
Ben finalement c'est bon, je me suit rabatu sur un tableau de tableau au lieu d'un tableau de hashs...

merci de votre attention
:)

++
0
Lamadamme Messages postés 4 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 6 avril 2010
24 févr. 2010 à 19:03
Bah non!
Ce n'est pas ordonné! L'ordre qu'on veut c'est celle de @ord = qw/ 1 5 4 6 2 8 3/;
On veut simplement imprimer le hashage selon @ord.
Dans ce cas là, ça fonctionne:
print "$_ $hash{$_}\n" for @ord;
On ne veut pas utiliser 'sort' puor ne pas modifier @ord.
C'est comme une Course de chevaux. Le premier est le cheval numéro 1, le seconde est le cheval numéro 5, le troisiéme est le 4, le quatriéme est le 6,...
[]'s
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 févr. 2010 à 19:08
Salut,

Si je comprends bien tu parles de tri par valeur et pas tri par clé.
C'est bien ça, ou tu parles d'une ordre que tu as choisis?
0
Lamadamme Messages postés 4 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 6 avril 2010
24 févr. 2010 à 19:23
Salut,
@ord = qw/ 1 5 4 6 2 8 3/;
$Hash{$numero_cheval} = $nom_cheval;
Ou même le contraire: $Hash{$nom_cheval} = $numero_cheval;
Peu importe, le cas est trier par l'ordre que j'avais choisi. ;)
[]'s
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 févr. 2010 à 20:01
Re,

Oui j'ai compris ce que tu voulais dire, mais le message initial demande un tri par valeur et pas une ordre spécifié.

le hash met ces valeur un peu ou ca l'arrange, et donc quand on veut relire les données contenu dans le hash une à une, celle-ci ne sont plus dans l'ordre.


D'ailleurs à mon tour j'ai mal compris et j'ai donné une mauvaise référence en 2005.

Dans son cas il faut faire un tri sur values %h

En ce qui concerne ton exemple qui n'est pas faux, j'ai mal compris au début ;-)
En ce qui concerne l'affichage on peut aussi faire quelque chose comme ça, mais comme tu le dis il faut s'assurer de l'existence des clés dans le hash
print "$_\n" for(@h{@ord});


Dans ce cas là, ça fonctionne:
print "$_ $hash{$_}\n" for @ord;


En revanche dans ce cas on peut utiliser exists pour s'assurer que les éléments de @ord sont des clés dans %hash
for (@ord){
  print "$_ $hash{$_}\n" if (exists $hash{$_});
}

J'aurais du commencé avec "Soit bienvenue sur CCM" ;-)
0
Lamadamme Messages postés 4 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 6 avril 2010
24 févr. 2010 à 21:04
Ok, t'a raison.
Merci pour le bienvenue... J'étais habitué à lire seulemment...
T'a raison dans la solution, mais je répondais la question:
"Comment fait on pour ranger un hash dans un ordre précis..."
Maintenant il y a beaucoup d'examples! :D
[]'s
0