IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[debutant] Conseils pour foreach imbriqués (et en sortir au bon moment !)


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 43
    Points : 37
    Points
    37
    Par défaut [debutant] Conseils pour foreach imbriqués (et en sortir au bon moment !)
    Bonjour,

    J'ai un fichier source (txt) que je veux nettoyer avec des stoplist figurant dans d'autres fichiers txt : si une ligne de mon fichier pollué correspond à l'une des lignes des stoplist je l'enregistre dans un nouveau fichier (ça me permet de verifier que les futures suppressions sont correctes).
    Je dois conserver les stoplists dans des fichiers différents car je ne leur applique pas les mêmes regex.

    Pour l'instant, ça donne un truc du genre :


    foreach $ligne_source(@fichier_source)
    {chomp $ligne_source;

    # Je verifie si la ligne figure dans la stopliste n°1 : si oui je l'enregistre dans le fichier "suppr"
    foreach $line(@stopliste1)
    {chomp $line;
    if $ligne_source =~ m/(\b$line\b)/
    {print FICHIER_SUPPR $ligne_source,"\n";next;}
    }

    # Je verifie si la ligne figure dans la stopliste n°2 : si oui je l'enregistre dans le fichier "suppr"
    foreach $line(@stopliste2)
    {chomp $line;
    if $ligne_source =~ m/(\b$line\b)/
    {print FICHIER_SUPPR $ligne_source,"\n";next;}
    }


    etc.
    }

    Mais je m'aperçois que même si la ligne a déjà été identifiée dans la première stoplist, elle est quand même testée par la deuxième ! J'ai tenté de mettre un next tout à la fin de chaque boucle foreach pour en sortir mais ça ne change rien.
    J'ai aussi tenté les elsif (foreach....){}, mais ça ne fonctionne pas non plus

    C'est peut-être (sans doute !) la méthode qui est mauvaise, je suis preneuse de vos suggestions.

    Merci !

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je ne sais pas ce qu'est une stoplist, j'en suis donc réduit à faire des suppositions.

    Par ailleurs, ce serait bien de présenter du code correctement formatté, surtout pour présenter des boucles imbriquées, ça aiderait à comprendre ce que tu veux faire.

    Je signale en outre qu'il y a des erreurs dans le code présenté, il ne risque pas de compiler. Par exemple, cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if $ligne_source =~ m/(\b$line\b)/
    ne peut pas compiler: la condition du if doit être entre parenthèses.


    Cela dit, je suppose que tu veux sortir du foreach interne et remonter au foreach externe. Il faut utiliser des étiquettes pour indiquer à Perl à quel niveau de boucle remonter.

    Quelque chose comme ceci devrait faire ce que tu désires:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    OUTER_LOOP: foreach $ligne_source(@fichier_source) {
        chomp $ligne_source;
     
        # Je verifie si la ligne figure dans la stopliste n°1 : si oui je l'enregistre dans le fichier "suppr"
        foreach $line(@stopliste1) {
            chomp $line;
            if ($ligne_source =~ m/(\b$line\b)/) {
                print FICHIER_SUPPR $ligne_source,"\n";
                next OUTER_LOOP;
            }
        }
     
        # Je verifie si la ligne figure dans la stopliste n°2 : si oui je l'enregistre dans le fichier "suppr"
        foreach $line(@stopliste2) {
        	chomp $line;
            if ($ligne_source =~ m/(\b$line\b)/) {
            	print FICHIER_SUPPR $ligne_source,"\n";
            	next OUTER_LOOP;
            }
        }
    }

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 43
    Points : 37
    Points
    37
    Par défaut
    Bonjour Lolo78,

    Merci pour ta réponse,
    oui tu as raison pour l''aspect visuel du code et les erreurs. Le pc sur lequel je code n'est pas relié à internet donc j'en suis réduite à recopier "à l'oeil" sur l'autre pc, d'où l'oubli des parenthèses
    Tu as très bien compris ce que je voulais faire avec le fait de remonter au foreach externe .

    Merci pour ta solution !

    (une stoplist c'est une liste de mots dont je ne veux pas dans mon fichier final, ils auraient dû être filtrés dès le début, mais comme je reprends le fichier en l'état je dois les supprimer)

    Bonne soirée et encore merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Debutant] Conseils pour l'architecture objet d'une appli
    Par etiennegaloup dans le forum Langage
    Réponses: 4
    Dernier message: 09/04/2006, 19h16
  2. [Debutant]Conseils pour le choix d'un environnement de dvpt
    Par etiennegaloup dans le forum Débuter
    Réponses: 10
    Dernier message: 05/04/2006, 21h39
  3. Réponses: 19
    Dernier message: 04/04/2006, 14h27
  4. Débutant: Conseils pour m'en sortir avec l'oo
    Par ukanoldai dans le forum Langage
    Réponses: 1
    Dernier message: 28/09/2005, 12h48
  5. [Debutant(e)]conseil pour une liste ?
    Par Tymk dans le forum Débuter
    Réponses: 5
    Dernier message: 05/08/2004, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo