Rechercher : dans
Par :

Boucles imbriquées Perl

Dernière réponse le 6 aoû 2008 à 17:32:23 Ptesoleil, le 6 aoû 2008 à 12:26:29 
 Signaler ce message aux modérateurs

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.

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « Boucles imbriquées Perl » dans :
Perl - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditonnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
Perl - Les fichiers VoirLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...
Les variables avec Perl VoirConcept de variable avec Perl Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage Perl peuvent être de trois...

1

jpetelescouilles, le 6 aoû 2008 à 14:32:53

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^^

Répondre à jpetelescouilles

2

Ptesoleil, le 6 aoû 2008 à 15:36:00

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).

Répondre à Ptesoleil

3

davlar, le 6 aoû 2008 à 16:23:24

Bonjour

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

David

Répondre à davlar

4

jpetelescouilles, le 6 aoû 2008 à 17:27:10

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).

Répondre à jpetelescouilles

5

 Ptesoleil, le 6 aoû 2008 à 17:32:23

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.

Répondre à Ptesoleil
Collection CommentÇaMarche.net