Perl est l'un des langages les plus puissants pour travailler avec des expressions régulières. Les opérateurs utilisés pour la correspondance sont =~ et !~.
Modificateurs des expressions régulières :
i — la casse n'est pas importanteg — recherche globale (toutes les occurrences)m — mode multiligne (fonctionne ^ et $ sur chaque ligne)s — le point (.) inclut le caractère de nouvelle ligneExemple :
my $text = "Mon email : max@mail.com et ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Email : $1 "; }
Dans cet exemple, la boucle extrait tous les emails de la chaîne.
Après la correspondance, les valeurs sont capturées dans des variables spéciales $1, $2, ... (pour chaque groupe capturant).
Que contiendra la variable $1 après une recherche infructueuse avec une expression régulière ?
Réponse :
$1ne se met pas à jour en cas d'échec de la correspondance — il conserve la valeur de la dernière correspondance réussie. C'est une source d'erreurs potentielle ! Pour éviter cela, dans des conditions complexes, il est préférable de réinitialiser explicitement$1,$2, ...
Histoire
La validation des données d'entrée avec une expression régulière complexe dépendait de la valeur de
$1. Après une correspondance qui n'a pas trouvé de chaîne appropriée, la variable$1n'a pas changé, et le traitement s'est déroulé avec l'ancienne adresse email incorrecte.
Histoire
Le programmeur a commis une erreur avec le modificateur. Dans un grand texte, ils ont appliqué
/abc/g, s'attendant à un mode multiligne. En conséquence, le motif ne trouvait pas les bonnes lignes avec des retours à la ligne, bien qu'il aurait fallu utiliser/abc/ms.
Histoire
Dans le projet, ils ont oublié d'utiliser le drapeau global
/glors de la recherche de toutes les occurrences. Conséquence — le script n'extrayait que la première correspondance, alors que l'utilisateur attendait une liste complète de données.