Boucles imbriquées Perl

Ptesoleil Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   -  
Ptesoleil Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   -
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
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   57
 
Bonjour

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

David
0
Utilisateur anonyme
 
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   Statut Membre Dernière intervention  
 
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