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 :

Problème éxécution condition dans une expression régulière.


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut Problème éxécution condition dans une expression régulière.
    Bonjour à tous,

    je débute en Perl et je suis confonté à un pb que je ne connais pas ? en faite voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach (@LINES) {
      if ($_= /<A target=\"_top\" HREF=\"(.*)\"><nobr>(.*)<\/A><\/TD>/ ) {
      ...
      }
      elsif ($_= /<A target=\"_top\" HREF=\"(.*)\"><nobr>(.*)                      </A><\/TD>/g) {
      ...
      }
    }
    Mon elsif ne semble pas être vérifié dans la condition ? peux t'on utiliser 2 fois dans une boucle la variable $_ ? L'expression vérifiée dans le elsif n' est t'elle vérifiée que si la condition If est positive ?

    Merci d'avance,
    Yann

    Edité par GLDavid, merci de penser aux balises code

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut Re: Problème éxécution condition dans une expression réguliè
    Citation Envoyé par panaone
    Mon elsif ne semble pas être vérifié dans la condition ? peux t'on utiliser 2 fois dans une boucle la variable $_ ?
    Il est tout à fait possible d'utiliser la variable $_ autant de fois que l'on veut, à l'intérieur d'une boucle.

    Comme cette variable est aussi la variable contextuelle, sur laquelle les traitements portent par défaut, il est possible de simplifier la syntaxe de correspondance d'expression rationnelle, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach (@ensemble) {
      if ( /motif/ ) {
        ...
      }
    }
    Ainsi, on ne précise pas que la correspondance est faite sur $_, ce qui est le cas par défaut, et cela évite l'erreur que tu as commise :
    l'opérateur de mise en correspondance d'expression rationnelle est =~, pas =.

    Tu aurais donc dû écrire, à défaut de la forme abrégée ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $_ =~ m/motif/ ) {
      ...
    }

    En outre, en fonction de ce que tu fais, dans tes conditions, il peut être avantageux de nommer la variable de parcours de la boucle ... dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach my $element (@ensemble) {
      if ( $element =~ m/motif/ ) {
        ...
      }
    }


    Citation Envoyé par panaone
    L'expression vérifiée dans le elsif n' est t'elle vérifiée que si la condition If est positive ?
    Le elsif, comme son nom l'indique, est une condition testée si la condition principale n'est pas vérifiée (c'est à dire si elle est fausse).


    Tu pourras trouver de l'information à ces différents sujets dans notre FAQ Perl, notamment à la rubrique sur les alternatives (les ifs), les boucles énumérées et les expressions rationnelles


    Bonne continuation.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut Explications pour un débutant
    Merci tout matche comme il faut mais peux tu m'expliquer pourquoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    $_ =~ m/motif/
    Tu me dis que l'opérateur de mise en correspondance d'expression rationnelle est =~, et pas =.
    >> Je croyais que lorsque que l'on utilise la variable $_ on peut omettre le =~ ??

    A quoi correspond le m dans m/motif/ ??? Quel est son rôle.

    Merci,
    Yann

  4. #4
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut Re: Explications pour un débutant
    Citation Envoyé par panaone
    Merci tout matche comme il faut mais peux tu m'expliquer pourquoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    $_ =~ m/motif/
    Tu me dis que l'opérateur de mise en correspondance d'expression rationnelle est =~, et pas =.
    >> Je croyais que lorsque que l'on utilise la variable $_ on peut omettre le =~ ??

    A quoi correspond le m dans m/motif/ ??? Quel est son rôle.

    Merci,
    Yann
    Tu peux ne pas utiliser le "=~" dans le cas où tu utilises la variable "$_" implicitement soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (/motif/) { ...}
    Il faut par contre utiliser le "=~" dans le cas où tu utilises une variable explicitement (que ce soit "$_" ou n'importe quelle autre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($_ =~ /motif/) {...}
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($toto =~ /motif/ {...}
    L'opérateur "=" n'étant utilisé en Perl que pour des affectations.
    Verre vide je te plains, verre plein, je te vide.

  5. #5
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut Re: Explications pour un débutant
    Citation Envoyé par panaone
    Merci tout matche comme il faut mais peux tu m'expliquer pourquoi ?

    Tu me dis que l'opérateur de mise en correspondance d'expression rationnelle est =~, et pas =.
    >> Je croyais que lorsque que l'on utilise la variable $_ on peut omettre le =~ ??
    Relis mon post, ainsi que l'explication de Jeh, ainsi, aussi que la FAQ Perl ... L'opérateur = est celui d'affectation, l'opérateur =~est celui de matching (mise en correspondance). Ce sont donc deux opérateurs distincts au fonctionnement différent.

    Lorsque l'on opère sur la variable $_, on est effectivement dispensé d'utiliser cet opérateur =~. On est d'ailleurs aussi dispensé de préciser qu'on travaille sur $_. C'est IMPLICITE !

    Ton problème, c'est qu'une expression de mise en relation (le =~) fait le match, mais retourne aussi un résultat (la liste des matches en contexte de liste, où leur nombre en contexte scalaire).

    Donc, lorsque tu écris : Tu fais un enchainement d'opérations :
    1- Tu fais la mise en correspondance (implicite) de $_ avec motif.
    2- Ensuite, tu affectes le résultat de cette mise en correspondance au scalaire $_. Tu écrases donc $_ avec 0 (pas de correspondance) ou n (nombre de correspondances du motif)
    3- Tu testes sur la valeur (nouvelle) de $_.

    C'est comme si tu avais écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($_ = ( $_ =~ m/motif/ )) {
      ...
    }
    Ton $_ est donc cramé pour la suite

    L'explication te convient elle ?

    Citation Envoyé par panaone
    A quoi correspond le m dans m/motif/ ??? Quel est son rôle.
    Le m est superflu, car c'est la fonction d'expression rationnelle par défaut, mais j'aime bien le préciser pour que les choses soient claires. C'est la fonction de recherche de motif (m comme match). Les autres possibilités sont s pour faire une substitution, ou tr pour une "traduction" (translittération, en fait).


    Bonne continuation.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut [resolu]
    Merci pour tes conseils et tes informations pertinentes !

    Yann

  7. #7
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Alors si tout va bien pour toi ... il faut marquer le sujet comme étant [résolu] au moyen du bouton portant cette même mention, en bas à gauche de l'interface quand tu visualises le message.

    Bonne continuation.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/08/2010, 10h39
  2. problème de capture dans une expression régulière
    Par waeselynck.raphael dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 02/02/2009, 11h34
  3. Réponses: 5
    Dernier message: 31/08/2006, 13h34
  4. [débutant] problème de condition dans une requete
    Par banker dans le forum Access
    Réponses: 5
    Dernier message: 22/03/2006, 13h52
  5. [EXP] Evaluation dans une expression régulière
    Par SergentHeinz dans le forum Langage
    Réponses: 7
    Dernier message: 10/11/2005, 18h17

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