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 literg — wyszukiwanie globalne (wszystkie wystąpienia)m — tryb wielowierszowy (działa ^ i $ dla każdej linii)s — kropka (.) obejmuje znak nowej liniiPrzykł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).
Co będzie przechowywane w zmiennej $1 po nieudanym wyszukiwaniu za pomocą wyrażenia regularnego?
Odpowiedź:
$1nie 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, ...
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$1nie 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
/gprzy wyszukiwaniu wszystkich wystąpień. Efekt — skrypt wyodrębniał tylko pierwsze dopasowanie, podczas gdy użytkownik oczekiwał pełnej listy danych.