OVH Cloud OVH Cloud

petit problème de débutant

2 réponses
Avatar
Julien Favre
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 :-)

2 réponses

Avatar
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";
}
}

__DATA__
jmax:kal:kil
gerard:ch1:ch2
jmax:titi:toto

--
Pierrick LE GALL
http://le-gall.net/pierrick

Avatar
Julien Favre
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,