ProgrammatiePerl-ontwikkelaar

Noem de kenmerken van Perl-reguliere expressies. Welke modifiers bestaan er en hoe verwerk je de resultaten van een match correct? Geef een voorbeeld van het parseren van een string met behulp van een reguliere expressie.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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 belangrijk
  • g — globale zoekopdracht (alle overeenkomsten)
  • m — meerregel modus (werkt ^ en $ op elke regel)
  • s — punt (.) omvat het nieuwe regelteken

Voorbeeld:

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.

Vraag met een val

Wat zal er in de variabele $1 staan na een mislukte zoekopdracht met een reguliere expressie?

Antwoord:

$1 wordt 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.

Voorbeelden van echte fouten door onwetendheid van de nuances van het onderwerp


Verhaal

Validatie van gebruikersinvoer met een complexe reguliere expressie hing af van de waarde van $1. Na een mislukte match veranderde de variabele $1 niet, 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/g toegepast, terwijl een meerregelmodus werd verwacht. Als resultaat vond het patroon de benodigde regels met overgangen niet, terwijl /abc/ms gebruikt had moeten worden.


Verhaal

In het project was de globale vlag /g vergeten bij het zoeken naar alle overeenkomsten. Gevolg — het script haalde alleen de eerste match op, terwijl de gebruiker een volledige lijst van gegevens verwachtte.