Boucles imbriquées Perl

Fermé
Ptesoleil Messages postés 27 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 27 août 2008 - 6 août 2008 à 12:26
Ptesoleil Messages postés 27 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 27 août 2008 - 6 août 2008 à 17:32
Bonjour,
J'ai un souci dans mon code Perl; j'utilise plusieurs boucle foreach imbriquées (certaines ouvrent des fichiers txt)

Voici mon code :

Foreach $line (@K) -- Parcours d'un tableau
if ($line =~ ...)
Foreach $... -- Parcours d'un hash
if ...
Foreach $data ... -- Parcours d'un fichier txt
if $data =~ ...
if (...)
Foreach ... -- Parcours d'un autre tableau d'un maximun de 4 lignes
(instructions)

Cependant lorsque j'execute il trouve la première condition de ma première boucle : execute toutes les instructions qui suivent mais ne continue plus à parcourir mon premier foreach et sort completement. J'ai essayé de rechercher du coté de next, last ou redo mais sans résultat.
Quelqu'un pourrait-il m'aider?
Merci.
A voir également:

5 réponses

Utilisateur anonyme
6 août 2008 à 14:32
Bonjour,

Là comme ça c'est pas évident de te répondre, ce qui est sur c'est qu'un simple if dans un foreach n'arretera jamais son exécution (sauf en cas de next / last / goto / return / etc...). Si tu pouvais mettre tout ton code (ou au moins la structure complète) ça serait déjà plus simple de voir ce qui ne va pas, parce que là y'a pas grand chose comme infos...
Essaye eventuellement de voir si le premier tableau que tu parcours contient bien plusieurs élements, on sait jamais^^
0
Ptesoleil Messages postés 27 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 27 août 2008
6 août 2008 à 15:36
Voici mon code en entier :

foreach $linekmtn (@$KMTN)
{
      if ($linekmtn =~ /^\s\#(\d+)\#\s(\d.+)\s\{(\w.+)\}/)
     {
          $specie1 = $1;
          $val = $2;
          $compound = $3;
              
          foreach $k (sort keys %$SpecRef)
          {
                if ($specie1 eq $k)
                {
                     foreach $data (@$allfile)
                     {
                           if ($data =~ m/(\d+\.\d+\.\d+\.\d+)\t(\w.+)\t(\w.+)\tc\t/i)
                           {
                                 $valEC = $1;
                                 $NameReact = $2;
                                 $Equation = $3;
 
                                  if ($valEC eq $numEC)
                                 {
                                       chomp $data;
                                       $data =~(s/^\d+\.\d+\.\d+\.\d+\t\w.+\t\w.+\tc\t//gi);

                                       @t = split (/;/,$data);
                                                     
                                       foreach my $ligne (@t)
                                       {
                                            chomp $ligne;
                                            ($shortC,$nameC,$formulaC) = split (/\t/,$ligne);
                                             print "$valEC\n"."ligne :$nameC / $compound \n";
                                             if ($nameC eq $compound)
                                             {
                                                 print FIL ("\n KM : $specie1 $compound$val");                          
                                             }
                                        }
                                   }
                             }
                        }
                 }
             }
      }
}


Quand je parcours mon premier tableau y a bien tous les elements mais une fois que je rentre dans les boucles y a plus qu'une ligne (contenant les informations que je voulais mais ne parcours pas le reste des lignes du premier tableau donc il me manque des informations).
0
davlar Messages postés 75 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 11 mai 2009 57
6 août 2008 à 16:23
Bonjour

As-tu essaye de declarer tes tableaux avant ta serie de foreach() ?

David
0
Utilisateur anonyme
6 août 2008 à 17:27
A priori je ne vois rien de choquant.

Question, tu utilises use strict; et use warnings; ? Si ce n'est pas le cas, il est possible que ton programme comporte un bug qui n'entraine pas d'affichage d'erreur, mais met un terme à l'exécution (mauvaise valeur dans une de tes variables par exemple).
0

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

Posez votre question
Ptesoleil Messages postés 27 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 27 août 2008
6 août 2008 à 17:32
Biensur que j'utilise un use strict et use warnings mais il ne me signale pas d'erreur. J'ai ausssi déclarer mes tableaux pas de souci. En faite j'ai reglé mon probleme : j'ai utilisé next if au lieu de if. et comme je remplace mon debut de ligne "data" par rien : j'ai ajouté une autre variable $da2 pour que la valeur de $data soit gardée en memoire.

chomp $data;
$da2 = $data;
$da2 =~ (s/^\d+\.\d+\.\d+\.\d+\t\w.+\t\w.+\tc\t//gi);
@t = split (/;/,$da2);

Cependant comme avant j'avais mis un if je voulais aussi ajouté un elsif qui ne marche plus si je met next if - donc j'ai fermé le foreach et réouvert. Pas très propre mais ca marche .
Merci.
0