Perl is een van de krachtigste talen voor het werken met reguliere expressies. Voor matching worden de operators =~ en !~ gebruikt.
Modifiers voor reguliere expressies:
i — hoofdlettergevoeligheid is niet belangrijkg — globale zoekopdracht (alle overeenkomsten)m — meerregel modus (werkt ^ en $ op elke regel)s — punt (.) omvat het nieuwe regeltekenVoorbeeld:
my $text = "Mijn email: max@mail.com en ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Email: $1 "; }
In dit voorbeeld haalt de lus alle emailadressen uit de string.
Na een match worden de waarden in speciale variabelen $1, $2, ... (voor elke capture group) opgeslagen.
Wat zal er in de variabele $1 staan na een mislukte zoekopdracht met een reguliere expressie?
Antwoord:
$1wordt niet bijgewerkt bij een onsuccesvolle match — het bevat de waarde van de laatste succesvolle match. Dit is een potentieel bron van fouten! Om dit te voorkomen, is het beter om$1,$2, ... expliciet te wissen in complexe situaties.
Verhaal
Validatie van gebruikersinvoer met een complexe reguliere expressie hing af van de waarde van
$1. Na een mislukte match veranderde de variabele$1niet, en de verwerking ging verder met het oude, onjuiste emailadres.
Verhaal
De programmeur maakte een fout met de modifier. In een grote tekst werd
/abc/gtoegepast, terwijl een meerregelmodus werd verwacht. Als resultaat vond het patroon de benodigde regels met overgangen niet, terwijl/abc/msgebruikt had moeten worden.
Verhaal
In het project was de globale vlag
/gvergeten bij het zoeken naar alle overeenkomsten. Gevolg — het script haalde alleen de eerste match op, terwijl de gebruiker een volledige lijst van gegevens verwachtte.