En utilisant l'excellent ouvrage de Damian Conway Regexp::Debugger J'ai essayé ça :
perl -MRegexp::Debugger -E '$_ = "a"; s/a*/e/g; say'
Et j'ai obtenu ce résultat, au cas où cela rendrait les choses plus claires, en mode d'enregistrement des événements. Le premier passage de la correspondance à travers le remplacement produit cet ensemble d'événements :
a | a* | Starting regex match
a | a* | Trying a literal character zero-or-more times (as many as possible)
| a* | Matched
| | Regex matched in 3 steps
Cela montre que le "a" est trouvé la première fois, et qu'il est remplacé par "e".
Après avoir terminé le match la première fois, le débogueur me permet de lancer un deuxième match à partir du même programme :
| <~~ | Back-tracking in regex
| a* | Back-tracked and restarting regex match
| a* | Trying a literal character zero-or-more times (as many as possible)
| a* | Matched
| | Regex matched in 3 steps
Cela montre que le "" après le "a" original (maintenant "e") correspond à la deuxième fois et est remplacé par "e".
Malheureusement, soit je ne sais pas comment lire la sortie, soit Regexp::Debugger s'embrouille à ce moment-là, mais il répète encore une fois, mais ne fait pas de remplacement.
| <~~ | Back-tracking in regex
| a* | Back-tracked and restarting regex match
| a* | Trying a literal character zero-or-more times (as many as possible)
| a* | Matched
| | Regex matched in 3 steps
Quoi qu'il en soit, soit Perl a trouvé une troisième correspondance et a décidé, pour une raison ou une autre, de ne pas effectuer de remplacement cette fois-ci, soit Regexp::Debugger, soit je suis simplement confus.
Edit : J'ai résolu ma confusion en revoyant perldoc perlre :
" Les boucles de niveau supérieur préservent un état supplémentaire entre les itérations : si la dernière correspondance était de longueur zéro. Pour rompre la boucle, il est interdit que le match suivant après un match de longueur nulle ait une longueur de zéro. Cette interdiction interagit avec le backtracking (voir "Backtracking"), et donc le deuxième meilleur match est choisi si le meilleur match est de longueur zéro."