programowanieProgramista Perl

Wymień cechy wyrażeń regularnych Perl. Jakie są modyfikatory i jak poprawnie przetwarzać wyniki dopasowania? Podaj przykład parsowania ciągu za pomocą wyrażenia regularnego.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

Perl to jeden z najpotężniejszych języków do pracy z wyrażeniami regularnymi. Do dopasowania używa się operatorów =~ i !~.

Modyfikatory wyrażeń regularnych:

  • i — nie rozróżnia wielkości liter
  • g — wyszukiwanie globalne (wszystkie wystąpienia)
  • m — tryb wielowierszowy (działa ^ i $ dla każdej linii)
  • s — kropka (.) obejmuje znak nowej linii

Przykład:

my $text = "Mój email: max@mail.com i ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Email: $1 "; }

W tym przykładzie pętla wyodrębnia wszystkie adresy e-mail z ciągu.

Po dopasowaniu wartości są przechwytywane w specjalnych zmiennych $1, $2, ... (dla każdej grupy przechwytującej).

Pytanie z zastrzeżeniem

Co będzie przechowywane w zmiennej $1 po nieudanym wyszukiwaniu za pomocą wyrażenia regularnego?

Odpowiedź:

$1 nie jest aktualizowane przy nieudanym dopasowaniu — przechowuje wartość ostatniego udanego dopasowania. To potencjalne źródło błędów! Aby tego uniknąć, w złożonych warunkach lepiej jawnie czyścić $1, $2, ...

Przykłady rzeczywistych błędów spowodowanych nieznajomością szczegółów tematu


Historia

Walidacja danych wejściowych z użyciem złożonego wyrażenia regularnego polegała na wartości $1. Po kolejnym dopasowaniu, które nie znalazło odpowiedniego ciągu, zmienna $1 nie zmieniła się, a przetwarzanie odbyło się na podstawie starego, niewłaściwego adresu e-mail.


Historia

Programista pomylił się z modyfikatorem. W dużym tekście zastosowano /abc/g, licząc na tryb wielowierszowy. W efekcie wzór nie znajdował potrzebnych ciągów z przeniesieniami, chociaż należało użyć /abc/ms.


Historia

W projekcie zapomniano użyć globalnego flagu /g przy wyszukiwaniu wszystkich wystąpień. Efekt — skrypt wyodrębniał tylko pierwsze dopasowanie, podczas gdy użytkownik oczekiwał pełnej listy danych.