Je voudrais effectuer un tri à partir de 'c', ce que j'ai fait avec votre aide, le problème étant que je voudrais trier 'c' en fonction de 'rat', or j'effectue un tri selon toutes les valeurs.
Sauriez-vous comment je peux m'y prendre pour ne prendre en compte que 'rat' dans le tri des valeurs ?
Merci.
C. Tobini
Bonjour à tous et merci pour vos réponses,
J'ai testé les différentes formes, notamment la 'sioux' que j'ai bien
apprécié.
Je me retrouve devant un autre problème :
Le hash que je vous ai indiqué est simplifié par rapport à celui que
j'ai réellement, en fait la forme est du style :
Je voudrais effectuer un tri à partir de 'c', ce que j'ai fait avec
votre aide, le problème étant que je voudrais trier 'c' en fonction
de 'rat', or j'effectue un tri selon toutes les valeurs.
Sauriez-vous comment je peux m'y prendre pour ne prendre en compte que
'rat' dans le tri des valeurs ?
Je voudrais effectuer un tri à partir de 'c', ce que j'ai fait avec votre aide, le problème étant que je voudrais trier 'c' en fonction de 'rat', or j'effectue un tri selon toutes les valeurs.
Sauriez-vous comment je peux m'y prendre pour ne prendre en compte que 'rat' dans le tri des valeurs ?
Merci.
C. Tobini
Paul Gaborit
À (at) 3 Feb 2006 07:57:13 -0800, "ctobini" écrivait (wrote):
Je me retrouve devant un autre problème :
Le hash que je vous ai indiqué est simplifié par rapport à celui que j'ai réellement, en fait la forme est du style :
Les flêches sont (prseque) toujours inutiles après une accolade ou un crocher fermants. On peut donc écrire :
$h->{'a'}{'b'}{'c'}{'mlp'} = 89;
Les quotes ou guillemets sont inutiles si on utilise un mot simple comme clé. On peut donc écrire :
$h->{a}{b}{c}{mlp} = 89;
Je voudrais effectuer un tri à partir de 'c', ce que j'ai fait avec votre aide, le problème étant que je voudrais trier 'c' en fonction de 'rat', or j'effectue un tri selon toutes les valeurs.
Sauriez-vous comment je peux m'y prendre pour ne prendre en compte que 'rat' dans le tri des valeurs ?
Votre demande n'est pas claire... Sans plus de précision, on ne peut que vous renvoyer vers les différents exemples de codes que nous vous avons déjà fournis. À vous de les adapter à votre besoin.
La démarche générale est relativement simple :
1 - identifiez les informations que vous voulez trier.
2 - identifiez le critère de tri de ces informations.
3 - réussir à produire une liste non triée de ces informations (par exemples les valeurs d'un tableau) ou de quelque chose qui permet de retrouver cette information (l'indice, la clé d'accès ou peut-être dans votre cas, la liste des clés d'accès).
4 - passer cette liste à travers 'sort' en lui indiquant la fonction de tri à appliquer.
Or dans votre demande, le point 1 n'est pas clair du tout. Pour le point 2, vous dites vouloir utiliser la valeur attachée à la clé 'rat'. Les points 3 et 4 ne sont que des techniques de programmation pour lesquelles on ne peut vous aider que si 1 et 2 sont déjà clairement définis.
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>
À (at) 3 Feb 2006 07:57:13 -0800,
"ctobini" <c.soucaille@gmail.com> écrivait (wrote):
Je me retrouve devant un autre problème :
Le hash que je vous ai indiqué est simplifié par rapport à celui que
j'ai réellement, en fait la forme est du style :
Les flêches sont (prseque) toujours inutiles après une accolade ou un
crocher fermants. On peut donc écrire :
$h->{'a'}{'b'}{'c'}{'mlp'} = 89;
Les quotes ou guillemets sont inutiles si on utilise un mot simple
comme clé. On peut donc écrire :
$h->{a}{b}{c}{mlp} = 89;
Je voudrais effectuer un tri à partir de 'c', ce que j'ai fait avec
votre aide, le problème étant que je voudrais trier 'c' en fonction
de 'rat', or j'effectue un tri selon toutes les valeurs.
Sauriez-vous comment je peux m'y prendre pour ne prendre en compte que
'rat' dans le tri des valeurs ?
Votre demande n'est pas claire... Sans plus de précision, on ne peut
que vous renvoyer vers les différents exemples de codes que nous vous
avons déjà fournis. À vous de les adapter à votre besoin.
La démarche générale est relativement simple :
1 - identifiez les informations que vous voulez trier.
2 - identifiez le critère de tri de ces informations.
3 - réussir à produire une liste non triée de ces informations (par
exemples les valeurs d'un tableau) ou de quelque chose qui permet
de retrouver cette information (l'indice, la clé d'accès ou
peut-être dans votre cas, la liste des clés d'accès).
4 - passer cette liste à travers 'sort' en lui indiquant la
fonction de tri à appliquer.
Or dans votre demande, le point 1 n'est pas clair du tout. Pour le
point 2, vous dites vouloir utiliser la valeur attachée à la clé
'rat'. Les points 3 et 4 ne sont que des techniques de programmation
pour lesquelles on ne peut vous aider que si 1 et 2 sont déjà
clairement définis.
--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
Les flêches sont (prseque) toujours inutiles après une accolade ou un crocher fermants. On peut donc écrire :
$h->{'a'}{'b'}{'c'}{'mlp'} = 89;
Les quotes ou guillemets sont inutiles si on utilise un mot simple comme clé. On peut donc écrire :
$h->{a}{b}{c}{mlp} = 89;
Je voudrais effectuer un tri à partir de 'c', ce que j'ai fait avec votre aide, le problème étant que je voudrais trier 'c' en fonction de 'rat', or j'effectue un tri selon toutes les valeurs.
Sauriez-vous comment je peux m'y prendre pour ne prendre en compte que 'rat' dans le tri des valeurs ?
Votre demande n'est pas claire... Sans plus de précision, on ne peut que vous renvoyer vers les différents exemples de codes que nous vous avons déjà fournis. À vous de les adapter à votre besoin.
La démarche générale est relativement simple :
1 - identifiez les informations que vous voulez trier.
2 - identifiez le critère de tri de ces informations.
3 - réussir à produire une liste non triée de ces informations (par exemples les valeurs d'un tableau) ou de quelque chose qui permet de retrouver cette information (l'indice, la clé d'accès ou peut-être dans votre cas, la liste des clés d'accès).
4 - passer cette liste à travers 'sort' en lui indiquant la fonction de tri à appliquer.
Or dans votre demande, le point 1 n'est pas clair du tout. Pour le point 2, vous dites vouloir utiliser la valeur attachée à la clé 'rat'. Les points 3 et 4 ne sont que des techniques de programmation pour lesquelles on ne peut vous aider que si 1 et 2 sont déjà clairement définis.
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>
ctobini
Bonjour,
Effectivement, c'est un peu fouilli (désolé) vu que la boucle que je donne en exemple est imbriquée dans une autre boucle car le tableau asser grand, avec différents agencement de clés. Je vais essayer d'être plus clair.
$h = {};
# mon but est de classer unit11 selon la valeur rattachée à rat $h{val1}{unit11}{1}{rat} = 5; $h{val1}{unit11}{1}{ooo} = 3; $h{val1}{unit11}{1}{iii} = 6; $h{val1}{unit11}{1}{ppp} = 4;
# j'ai plusieurs critères de tri, et je 'raccroche' le tri que je voudrais effectuer à partir de $k3 car les boucles concernant $k et $k2 servent dans une boucle principale. foreach $k (keys %{$h}) { #ici val1 foreach $k2 (keys %{$h->{$k}}) { #ici unit11 # ici le tri que je voudrais effectuer -> unit11 classé selon 'rat' # la méthode que vous m'avez indiquée fait effectivement le classement que je souhaite, mais sur la totalité des valeurs suivant les clés rattachées à unit11 foreach my $k3 ( sort { $h->{$k}->{$k2}->{$a->[0]}->{$a->[1]} <=> $h->{$k}->{$k2}->{$b->[0]}->{$b->[1]} } map { $t = $_; (map{[$t, $_]} keys %{$h->{$k}->{$k2}->{$t}}) } keys %{$h->{$k}->{$k2}}) { print "$k3->[0] $k3->[1] ".$h->{$k}->{$k2}->{$k3->[0]}->{$k3->[1]}."n"; } } }
Ce que je voudrais, c'est en fait à partir de $k3, indiquer que c'est 'rat' qui détermine le trie, or, en passant par keys(), je ne vois pas comment obtenir uniquement la valeur de 'rat' comme critère.
Encore désolé et merci du coup de main.
C. Tobini
Bonjour,
Effectivement, c'est un peu fouilli (désolé) vu que la boucle que je
donne en exemple est imbriquée dans une autre boucle car le tableau
asser grand, avec différents agencement de clés. Je vais essayer
d'être plus clair.
$h = {};
# mon but est de classer unit11 selon la valeur rattachée à rat
$h{val1}{unit11}{1}{rat} = 5;
$h{val1}{unit11}{1}{ooo} = 3;
$h{val1}{unit11}{1}{iii} = 6;
$h{val1}{unit11}{1}{ppp} = 4;
# j'ai plusieurs critères de tri, et je 'raccroche' le tri que je
voudrais effectuer à partir de $k3 car les boucles concernant $k et
$k2 servent dans une boucle principale.
foreach $k (keys %{$h}) { #ici val1
foreach $k2 (keys %{$h->{$k}}) { #ici unit11
# ici le tri que je voudrais effectuer -> unit11 classé selon 'rat'
# la méthode que vous m'avez indiquée fait effectivement le
classement que je souhaite, mais sur la totalité des valeurs suivant
les clés rattachées à unit11
foreach my $k3 ( sort
{ $h->{$k}->{$k2}->{$a->[0]}->{$a->[1]} <=>
$h->{$k}->{$k2}->{$b->[0]}->{$b->[1]} }
map { $t = $_; (map{[$t, $_]} keys
%{$h->{$k}->{$k2}->{$t}}) }
keys %{$h->{$k}->{$k2}}) {
print "$k3->[0] $k3->[1]
".$h->{$k}->{$k2}->{$k3->[0]}->{$k3->[1]}."n";
}
}
}
Ce que je voudrais, c'est en fait à partir de $k3, indiquer que c'est
'rat' qui détermine le trie, or, en passant par keys(), je ne vois pas
comment obtenir uniquement la valeur de 'rat' comme critère.
Effectivement, c'est un peu fouilli (désolé) vu que la boucle que je donne en exemple est imbriquée dans une autre boucle car le tableau asser grand, avec différents agencement de clés. Je vais essayer d'être plus clair.
$h = {};
# mon but est de classer unit11 selon la valeur rattachée à rat $h{val1}{unit11}{1}{rat} = 5; $h{val1}{unit11}{1}{ooo} = 3; $h{val1}{unit11}{1}{iii} = 6; $h{val1}{unit11}{1}{ppp} = 4;
# j'ai plusieurs critères de tri, et je 'raccroche' le tri que je voudrais effectuer à partir de $k3 car les boucles concernant $k et $k2 servent dans une boucle principale. foreach $k (keys %{$h}) { #ici val1 foreach $k2 (keys %{$h->{$k}}) { #ici unit11 # ici le tri que je voudrais effectuer -> unit11 classé selon 'rat' # la méthode que vous m'avez indiquée fait effectivement le classement que je souhaite, mais sur la totalité des valeurs suivant les clés rattachées à unit11 foreach my $k3 ( sort { $h->{$k}->{$k2}->{$a->[0]}->{$a->[1]} <=> $h->{$k}->{$k2}->{$b->[0]}->{$b->[1]} } map { $t = $_; (map{[$t, $_]} keys %{$h->{$k}->{$k2}->{$t}}) } keys %{$h->{$k}->{$k2}}) { print "$k3->[0] $k3->[1] ".$h->{$k}->{$k2}->{$k3->[0]}->{$k3->[1]}."n"; } } }
Ce que je voudrais, c'est en fait à partir de $k3, indiquer que c'est 'rat' qui détermine le trie, or, en passant par keys(), je ne vois pas comment obtenir uniquement la valeur de 'rat' comme critère.
Encore désolé et merci du coup de main.
C. Tobini
Paul Gaborit
À (at) 6 Feb 2006 03:51:06 -0800, "ctobini" écrivait (wrote):
Effectivement, c'est un peu fouilli (désolé) vu que la boucle que je donne en exemple est imbriquée dans une autre boucle car le tableau asser grand, avec différents agencement de clés. Je vais essayer d'être plus clair.
$h = {};
# mon but est de classer unit11 selon la valeur rattachée à rat $h{val1}{unit11}{1}{rat} = 5;
# j'ai plusieurs critères de tri, et je 'raccroche' le tri que je voudrais effectuer à partir de $k3 car les boucles concernant $k et $k2 servent dans une boucle principale. foreach $k (keys %{$h}) { #ici val1 foreach $k2 (keys %{$h->{$k}}) { #ici unit11 # ici le tri que je voudrais effectuer -> unit11 classé selon 'rat' # la méthode que vous m'avez indiquée fait effectivement le classement que je souhaite, mais sur la totalité des valeurs suivant les clés rattachées à unit11 foreach my $k3 ( sort { $h->{$k}->{$k2}->{$a->[0]}->{$a->[1]} <=> $h->{$k}->{$k2}->{$b->[0]}->{$b->[1]} } map { $t = $_; (map{[$t, $_]} keys %{$h->{$k}->{$k2}->{$t}}) } keys %{$h->{$k}->{$k2}}) { print "$k3->[0] $k3->[1] ".$h->{$k}->{$k2}->{$k3->[0]}->{$k3->[1]}."n"; } } }
Ce que je voudrais, c'est en fait à partir de $k3, indiquer que c'est 'rat' qui détermine le trie, or, en passant par keys(), je ne vois pas comment obtenir uniquement la valeur de 'rat' comme critère.
En fait ce que vous voulez trier ce sont les clés de la table de hachage %{$h->{$k}{$k2}} ($k et $k2 sont donc constants pour le tri). Et pour une clé donnée ($a par exemple), la valeur à comparer (je suppose une comparaison numérique) est $h->{$k}{$k2}{$a}{rat}. Donc :
foreach my $k (keys %{$h}) { #ici val1 foreach my $k2 (keys %{$h->{$k}}) { #ici unit11 foreach my $k3 (sort { $h->{$k}{$k2}{$a}{rat} <=> $h->{$k}{$k2}{$a}{rat} } keys %{$h->{$k}{$k2}}) { # ici, les valeurs de $k3 arrivent triées... print "$k $k2 $k3:n"; foreach my $f (qw/rat ooo iii ppp/) { print "t$f -> $h->{$k}{$k2}{$k3}{$f}n" } } } }
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>
À (at) 6 Feb 2006 03:51:06 -0800,
"ctobini" <c.soucaille@gmail.com> écrivait (wrote):
Effectivement, c'est un peu fouilli (désolé) vu que la boucle que je
donne en exemple est imbriquée dans une autre boucle car le tableau
asser grand, avec différents agencement de clés. Je vais essayer
d'être plus clair.
$h = {};
# mon but est de classer unit11 selon la valeur rattachée à rat
$h{val1}{unit11}{1}{rat} = 5;
# j'ai plusieurs critères de tri, et je 'raccroche' le tri que je
voudrais effectuer à partir de $k3 car les boucles concernant $k et
$k2 servent dans une boucle principale.
foreach $k (keys %{$h}) { #ici val1
foreach $k2 (keys %{$h->{$k}}) { #ici unit11
# ici le tri que je voudrais effectuer -> unit11 classé selon 'rat'
# la méthode que vous m'avez indiquée fait effectivement le
classement que je souhaite, mais sur la totalité des valeurs suivant
les clés rattachées à unit11
foreach my $k3 ( sort
{ $h->{$k}->{$k2}->{$a->[0]}->{$a->[1]} <=>
$h->{$k}->{$k2}->{$b->[0]}->{$b->[1]} }
map { $t = $_; (map{[$t, $_]} keys
%{$h->{$k}->{$k2}->{$t}}) }
keys %{$h->{$k}->{$k2}}) {
print "$k3->[0] $k3->[1]
".$h->{$k}->{$k2}->{$k3->[0]}->{$k3->[1]}."n";
}
}
}
Ce que je voudrais, c'est en fait à partir de $k3, indiquer que c'est
'rat' qui détermine le trie, or, en passant par keys(), je ne vois pas
comment obtenir uniquement la valeur de 'rat' comme critère.
En fait ce que vous voulez trier ce sont les clés de la table de
hachage %{$h->{$k}{$k2}} ($k et $k2 sont donc constants pour le
tri). Et pour une clé donnée ($a par exemple), la valeur à comparer
(je suppose une comparaison numérique) est $h->{$k}{$k2}{$a}{rat}.
Donc :
foreach my $k (keys %{$h}) { #ici val1
foreach my $k2 (keys %{$h->{$k}}) { #ici unit11
foreach my $k3 (sort {
$h->{$k}{$k2}{$a}{rat} <=> $h->{$k}{$k2}{$a}{rat}
} keys %{$h->{$k}{$k2}}) {
# ici, les valeurs de $k3 arrivent triées...
print "$k $k2 $k3:n";
foreach my $f (qw/rat ooo iii ppp/) {
print "t$f -> $h->{$k}{$k2}{$k3}{$f}n"
}
}
}
}
--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
À (at) 6 Feb 2006 03:51:06 -0800, "ctobini" écrivait (wrote):
Effectivement, c'est un peu fouilli (désolé) vu que la boucle que je donne en exemple est imbriquée dans une autre boucle car le tableau asser grand, avec différents agencement de clés. Je vais essayer d'être plus clair.
$h = {};
# mon but est de classer unit11 selon la valeur rattachée à rat $h{val1}{unit11}{1}{rat} = 5;
# j'ai plusieurs critères de tri, et je 'raccroche' le tri que je voudrais effectuer à partir de $k3 car les boucles concernant $k et $k2 servent dans une boucle principale. foreach $k (keys %{$h}) { #ici val1 foreach $k2 (keys %{$h->{$k}}) { #ici unit11 # ici le tri que je voudrais effectuer -> unit11 classé selon 'rat' # la méthode que vous m'avez indiquée fait effectivement le classement que je souhaite, mais sur la totalité des valeurs suivant les clés rattachées à unit11 foreach my $k3 ( sort { $h->{$k}->{$k2}->{$a->[0]}->{$a->[1]} <=> $h->{$k}->{$k2}->{$b->[0]}->{$b->[1]} } map { $t = $_; (map{[$t, $_]} keys %{$h->{$k}->{$k2}->{$t}}) } keys %{$h->{$k}->{$k2}}) { print "$k3->[0] $k3->[1] ".$h->{$k}->{$k2}->{$k3->[0]}->{$k3->[1]}."n"; } } }
Ce que je voudrais, c'est en fait à partir de $k3, indiquer que c'est 'rat' qui détermine le trie, or, en passant par keys(), je ne vois pas comment obtenir uniquement la valeur de 'rat' comme critère.
En fait ce que vous voulez trier ce sont les clés de la table de hachage %{$h->{$k}{$k2}} ($k et $k2 sont donc constants pour le tri). Et pour une clé donnée ($a par exemple), la valeur à comparer (je suppose une comparaison numérique) est $h->{$k}{$k2}{$a}{rat}. Donc :
foreach my $k (keys %{$h}) { #ici val1 foreach my $k2 (keys %{$h->{$k}}) { #ici unit11 foreach my $k3 (sort { $h->{$k}{$k2}{$a}{rat} <=> $h->{$k}{$k2}{$a}{rat} } keys %{$h->{$k}{$k2}}) { # ici, les valeurs de $k3 arrivent triées... print "$k $k2 $k3:n"; foreach my $f (qw/rat ooo iii ppp/) { print "t$f -> $h->{$k}{$k2}{$k3}{$f}n" } } } }
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>
Paul Gaborit
À (at) Mon, 06 Feb 2006 13:38:15 +0100, Paul Gaborit écrivait (wrote): [...]