ProgrammationDéveloppeur Perl

Énumérez les caractéristiques des expressions régulières Perl. Quels modificateurs existent et comment traiter correctement les résultats de la correspondance ? Donnez un exemple de parsing d'une chaîne avec une expression régulière.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 importante
  • g — recherche globale (toutes les occurrences)
  • m — mode multiligne (fonctionne ^ et $ sur chaque ligne)
  • s — le point (.) inclut le caractère de nouvelle ligne

Exemple :

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).

Question piège

Que contiendra la variable $1 après une recherche infructueuse avec une expression régulière ?

Réponse :

$1 ne 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, ...

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


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 $1 n'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 /g lors 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.