Re: Probléme perl avec l'operateur =~

Top Page

Reply to this message
Author: Michel Buonomo
Date:  
To: Regis Gras
CC: guilde
Subject: Re: Probléme perl avec l'operateur =~
Bonour,

Il trouve tous les motifs si tu enlève le g dans ($ligne
=~ /$motif_cherche[$indice]/g ).
/g en contexte de liste liste permet de renvoyer toutes les occurrences,
mais en contexte scalaire, le comportement est différent :


> The /g modifier specifies global pattern matching--that is, matching
> as many times as possible within the string. How it behaves depends on
> the context. In list context, it returns a list of the substrings
> matched by any capturing parentheses in the regular expression. If
> there are no parentheses, it returns a list of all the matched
> strings, as if there were parentheses around the whole pattern.
>
> In scalar context, each execution of m//g finds the next match,
> returning true if it matches, and false if there is no further match.
> The position after the last match can be read or set using the pos()
> function; see pos. A failed match normally resets the search position
> to the beginning of the string, but you can avoid that by adding
> the /c modifier (e.g. m//gc). Modifying the target string also resets
> the search position.

(source :
http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators )


(ou en français, si le lien fonctionne :
http://books.google.fr/books?id=5-083s5BEPUC&pg=PA134&lpg=PA134&dq=utilis%C3%A9+en+contexte+scalaire+le+modificateur+d%C3%A9tection+progressive&source=web&ots=Qvh-kY0a5-&sig=h352nOwEQXxeSVGTfbUZtu5UMSU&hl=fr&sa=X&oi=book_result&resnum=1&ct=result )

Mich'L


Le jeudi 02 octobre 2008 à 09:19 +0200, Regis Gras a écrit :
> J'utilise =~ (match) pour reperer un motif dans une chaine
>     Vu que cela ne produisait pas ce que souhaitais, j'ai ecrit un 
> programme de test qui met
> en evidence mon probléme:
> -----------------------------------------------------------
> use strict;
> my $ligne;
> my $indice;
> my $motif;
> my @motif_cherche;

>
> $motif_cherche[0] = "bb";
> $motif_cherche[1] = "123";
> $motif_cherche[2] = "nnn";
> $motif_cherche[3] = "aa";
> $motif_cherche[4] = "lkjhg";
> $motif_cherche[5] = "bg";
> $motif_cherche[6] = "aa";
> $motif_cherche[7] = "aa";
> $motif_cherche[8] = "nnn";
>
> $ligne = "aa nnn bg kjy lku bb fde 123";
> print "Ligne a explorer $ligne \n\n";
> for ($indice=0;$indice<9;$indice++) {
>         if ($ligne =~ /$motif_cherche[$indice]/g ) {
>         print ("Indice du motif: $indice motif:  $motif_cherche[$indice] 
> \t dans $ligne  \n");
>         }
> }
> -----------------------------------------------------------

>
> A l'excution, j'ai le resultat suivant:
> Indice du motif: 0 motif:  bb      dans aa nnn bg kjy lku bb fde 123
> Indice du motif: 1 motif:  123     dans aa nnn bg kjy lku bb fde 123
> Indice du motif: 3 motif:  aa      dans aa nnn bg kjy lku bb fde 123
> Indice du motif: 5 motif:  bg      dans aa nnn bg kjy lku bb fde 123
> Indice du motif: 7 motif:  aa      dans aa nnn bg kjy lku bb fde 123
> Indice du motif: 8 motif:  nnn     dans aa nnn bg kjy lku bb fde 123

>
> D'où mes questions.
>     - Pourquoi "nnn" n'est pas trouvé à l'indice 2 ?
>     - Pourquoi "aa" n'est pas trouvé à l'indice 6 ?

>
> Bien cordialement
>