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 :

While à 2 conditions et Expression reguliere


Sujet :

Langage Perl

  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Par défaut While à 2 conditions et Expression reguliere
    Bonjours à tous
    je désire récupérer la première itération d'un fichier dont j'ai l' expression régulière.
    Pour cela j'utilise un booléen $notFound = '1' que je set a 0 quand je trouve l' expression.
    <indexPassed> est le descripteur de mon fichier.
    Si je retire la 2° condition du while mon expression régulière fonctionne correctement je rentre dans ma condition
    par contre avec la 2° condition je rentre bien dans la boucle mais la condition n'est plus vérifié voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $notFound = '1';
    while ($ligne = <indexPassed> && $notFound)
            {
            print $ligne;
            if ($ligne =~ /dashboard\/tab\//)
                    {
                    print "je set notFound a 0";
                    print "$&\n";
                    $notFound = '0';
                    }
            }
    et $ligne me renvoie 1
    merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Par défaut
    Je sais pas si j'ai bien compris le but de la manip mais il me semble que ceci devrait correspondre au besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while( $ligne = <indexPassed> ){
            print $ligne;
            if( $ligne =~ /dashboard\/tab\// ){
                    print 'je sorts de la boucle'."\n";
                    break;
            }
    }
    Edit: La condition booléenne dans la boucle qui itère sur le descripteur de fichier ne fait, à mon avis, pas bon ménage. D'où ton problème.

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Par défaut
    tout mon fichier est affiché avec cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while( $ligne = <indexPassed> ){
            print $ligne;
            if( $ligne =~ /dashboard\/tab\// ){
                    print 'je sorts de la boucle'."\n";
                    break;
            }
    }
    j ai contourné le problème avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while ($notFound)
            {
            while (<indexPassed>)
            {
                    last if !$notFound;
                    if (/dashboard\/tab\/build\/detail\/beeware-os-NG\/[0-9]+/)
                            {
                            print "$&\n";
                            $notFound = '0';
                            }
                    }
            }
    je trouve ca un peu barbare si quelqu'un a mieu à me proposer

  4. #4
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Si j'ai bien compris, il faut simplement sortir de la boucle une fois le motif rencontré? Pourquoi ne pas simplement faire :

    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    open my $indexPassed, '<', 'chemin\fichier' or die;
     
     
     
    while (my $line = <$indexPassed>){
    	if ($line =~ m/dashboard\/tab\/build\/detail\/beeware-os-NG\/[0-9]+/){
    		print "$&\n";
    		last;
    	}
    }
     
    close $indexPassed;

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Par défaut
    Merci c est ce que je cherchais

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Par défaut
    Autant pour moi. break est une instruction C. last est effectivement plus adapté au perl.

  7. #7
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Break existe également en Perl, mais je n'ai jamais dû l'utiliser, je me sers toujours de last.

  8. #8
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Perl sait gérer les valeurs numériques tu sais... pas besoin de toutes les mettre entre guillemets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $line;
     
    while( $line = <$indexPassed> ) {
      last if $line =~ m{dashboard/tab/};
    }
     
    print $line;
    Par ailleurs 'break' ne marche qu'en conjonction avec 'given' (le 'switch' de Perl, introduit en 5.10). Dans une boucle les instructions de contrôle de flot sont 'last', 'next' et 'redo'.

    --
    Jedaï

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

Discussions similaires

  1. [EXPRESSION REGULIERE][WHILE][\gsmi] boucle infini
    Par floanne dans le forum Langage
    Réponses: 8
    Dernier message: 27/07/2007, 18h40
  2. Expressions regulieres dans condition
    Par Matmal11 dans le forum Linux
    Réponses: 4
    Dernier message: 23/02/2007, 15h05
  3. Expression Reguliere, condition et resultat
    Par n8ken dans le forum Langage
    Réponses: 7
    Dernier message: 17/03/2006, 16h46
  4. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 18h06
  5. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 17h14

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