bonjour,
je débute en perl et je suis satisfait de la puissance de la chose :-)
je bute sur un petit problème de tableau/liste qu'un connaisseur saura
sans doute résoudre sans peine.
mon fichier de données:
jmax:kal:kil
gerard:ch1:ch2
jmax:titi:toto
mon petit prog perl doit mettre dans un tableau indéxé sur le premier
champ toute la ligne pour le relire ultérieurement.
ce petit code a le défaut qu'il ne conserve que la dernière ligne
correspondant au premier champ:
use vars qw(@tab $var);
while (<>) {
($var) = split(/:/, $_);
$tab[$var] = $_;
printf "JMAX%s\n", $var;
}
plus tard, si je parcours mon tableau tab, il me manque la première
ligne avec jmax et c'est normal.
comment faire pour tout garder puis accèder directement dans tab à
toutes les lignes avec le premier champ à jmax ?
merci de vos réponses éclairées :-)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pierrick LE GALL
Julien Favre writes:
bonjour,
bonsoir Julien,
comment faire pour tout garder puis accèder directement dans tab à toutes les lignes avec le premier champ à jmax ?
Le problème, c'est que tu souhaites utiliser le premier champ comme clef, alors qu'on risque d'avoir des doublons sur ce premier champs, c'est une mauvaise utilisation du tableau associatif. Je te propose une variante, qui à chaque clef (chaque premier champ de la ligne) associe une liste de ligne.
use strict; use warnings;
# on stocke les lignes dans un tableau associatif, un hash my %lines = ();
# pour l'exercice, on lit le pseudo descripteur de fichier DATA while (my $string_line = <DATA>) { # nettoyage de la fin de ligne chomp $string_line;
my $key = (split /:/, $string_line, 2)[0];
push @{$lines{$key}}, $string_line; }
foreach my $key (keys %lines) { printf( "=== [%s] has %d linesn", $key, scalar(@{ $lines{$key} }) );
foreach my $string_line (@{$lines{$key}}) { print $string_line, "n"; } }
comment faire pour tout garder puis accèder directement dans tab à
toutes les lignes avec le premier champ à jmax ?
Le problème, c'est que tu souhaites utiliser le premier champ comme
clef, alors qu'on risque d'avoir des doublons sur ce premier champs,
c'est une mauvaise utilisation du tableau associatif. Je te propose une
variante, qui à chaque clef (chaque premier champ de la ligne) associe
une liste de ligne.
use strict;
use warnings;
# on stocke les lignes dans un tableau associatif, un hash
my %lines = ();
# pour l'exercice, on lit le pseudo descripteur de fichier DATA
while (my $string_line = <DATA>) {
# nettoyage de la fin de ligne
chomp $string_line;
my $key = (split /:/, $string_line, 2)[0];
push @{$lines{$key}}, $string_line;
}
foreach my $key (keys %lines) {
printf(
"=== [%s] has %d linesn",
$key,
scalar(@{ $lines{$key} })
);
foreach my $string_line (@{$lines{$key}}) {
print $string_line, "n";
}
}
comment faire pour tout garder puis accèder directement dans tab à toutes les lignes avec le premier champ à jmax ?
Le problème, c'est que tu souhaites utiliser le premier champ comme clef, alors qu'on risque d'avoir des doublons sur ce premier champs, c'est une mauvaise utilisation du tableau associatif. Je te propose une variante, qui à chaque clef (chaque premier champ de la ligne) associe une liste de ligne.
use strict; use warnings;
# on stocke les lignes dans un tableau associatif, un hash my %lines = ();
# pour l'exercice, on lit le pseudo descripteur de fichier DATA while (my $string_line = <DATA>) { # nettoyage de la fin de ligne chomp $string_line;
my $key = (split /:/, $string_line, 2)[0];
push @{$lines{$key}}, $string_line; }
foreach my $key (keys %lines) { printf( "=== [%s] has %d linesn", $key, scalar(@{ $lines{$key} }) );
foreach my $string_line (@{$lines{$key}}) { print $string_line, "n"; } }
Le problème, c'est que tu souhaites utiliser le premier champ comme clef, alors qu'on risque d'avoir des doublons sur ce premier champs, c'est une mauvaise utilisation du tableau associatif. Je te propose une variante, qui à chaque clef (chaque premier champ de la ligne) associe une liste de ligne.
ça marche super. merci beaucoup,
Le problème, c'est que tu souhaites utiliser le premier champ comme
clef, alors qu'on risque d'avoir des doublons sur ce premier champs,
c'est une mauvaise utilisation du tableau associatif. Je te propose une
variante, qui à chaque clef (chaque premier champ de la ligne) associe
une liste de ligne.
Le problème, c'est que tu souhaites utiliser le premier champ comme clef, alors qu'on risque d'avoir des doublons sur ce premier champs, c'est une mauvaise utilisation du tableau associatif. Je te propose une variante, qui à chaque clef (chaque premier champ de la ligne) associe une liste de ligne.