Merci.
Cette partie là du programme fonctionne correctement. Ca marche très bien en faisant $liste[$l] = $tmp[3]; mais c'est vrai que ce n'est certainement pas la meilleure façon de l'écrire. J'ai donc opté pour la fonction push, je ne savais pas que ca pouvait s'écrire comme cela.
J'ai un fichier qui possède sur chaque ligne des informations spécifiques à une société (adresse ip, nom societe, AS number, ...). Le nom de société se trouve à la 3ème place dans mon fichier. C'est regroupé par société, par exemple, les trois premières lignes auront le même nom de société, la deuxième société aura les 5 prochaines lignes etc... Je récupère ce nom sur chaque ligne et je le veux qu'une seule fois d'où l'utilisation de $before ainsi que le test. par contre, je veux associé au nom de société les lignes du fichier correspondantes. J'insère ensuite chaque nom de société dans un hash avec un tableau en valeur.
ex de ligne du fichier :
X.X.X.X;Belgium;ASXX;Société;http://www.siteinternet.com
X.X.X.X;Belgium;ASXX;Société;http://www.siteinternet.com
X.X.X.X;France;ASXX;Société;http://www.siteinternet.com
...
Je travaille toujours dans le même fichier, je l'ouvre une première fois pour récupérer les noms de sociétés que je mets dans un tableau (@liste) puis je le parcours à nouveau plusieurs fois pour faire les tests sur les sociétés afin d'associer dans le hash la societe avec les bonnes informations.
J'ai changé quelque truc et voilà une bonne partie du code :
open(FICHIER, "$nom1.Geo" ) || die "Impossible d'ouvrir le fichier $nom1 :$!";
my $l = 0;
my $before = "";
while (defined($ligne = <FICHIER> ))
{
my @tmp = split (/;/,$ligne);
if ($before ne $tmp[3])
{
#$liste[$l] = $tmp[3];
push @liste, $tmp[3];
$before = $liste[$l];
$l++;
}
}
print "@liste";
close (FICHIER);
my $element = @liste;
print "Element = $element\n";
open(FICHIER, "$nom1.Geo" ) || die "Impossible d'ouvrir le fichier $nom1 :$!";
for ($l=0;$l<=$element;$l++)
{
while (defined($ligne = <FICHIER> ))
{
@test= split (/;/,$ligne);
my $nb_elt = @test;
if ( $test[3] eq $liste[$l])
{
$tab[$i][$nb_elt+1]=$nb_elt;
for ($j=0;$j<=$nb_elt;$j++){
$tab[$i][$j] = $test[$j];
}
$i++;
}
}
my $atab;
for $atab ( @tab ) {
print "\n[ @$atab ],\n";
}
%h = (
"$liste[$l]" => [@tab]
);
@tab = ();
}
C'est un peu tordu certes, mais je n'ai pas trouvé plus simple pour être sur de créer un tableau avec les informations correspondant bien à une société (allant de 1 à plusieurs lignes dans le fichier, c'est pour ca que j'utilise un tableau à 2 dimensions). Mais ca fonctionne pas parfaitement, il ne fait la boucle for qu'une seule fois, il affiche le tableau résultant de l'analyse de la première société.
De plus, forcément je référence un tableau que je vide apres pour y mettre les nouvelles informations mais je ne sais pas comment envoyer mon tableau @tab de la structure conditionnelle dans le hash sans l'écraser ensuite... est ce possible avec des références ?
Et je me dis aussi que dans ma boucle for, je parcours le fichier mais je ne retourne pas en début de fichier à la fin du while. Est ce que ca se fait automatiquement ?
Ce que je veux au final, c'est associer dans un hash, chaque nom de société avec un tableau à 2 dimensions correspondant aux informations de la société.
J'espère que j'ai étais plus clair...
Message édité par manuche59 le 22-09-2009 à 14:59:10