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
>