6. Wyrażenia Regularne

Jeśli do tej pory potrzeba wymagała użycia komendy grep lub expr do porównania z wyrażeniem regularnym, to w Perlu używa się "regexp".

6.1. Dopasowanie wyrażeń regularnych


	. dowolny znak z wyjątkiem nowej linii
	c* zero lub więcej razy powtórzony znak c
	c+ raz lub więcej znak c
	c? zero lub raz znak c
	[klasa] dowolny znak z klasy
	\w znak alfanumeryczny (z "_")
	\W nie alfanumeryczny (z "_")
	\b granice słowa
	\B bez granic
	\s biały znak
	\S nie biały znak
	\d cyfra
	\D nie cyfra
	^ początek linii
	$ koniec linii
        | alternatywa
        {n} dokładnie n razy
        {n,} conajmniej n razy
        {n,m} pomiędzy n a m razy
Ponadto \n, \r, \f, \t, oraz \NNN jak w C. Przykładem komendy może być: m/wzor/cgimosx - co oznacza:

  "c" - nie resetuj pozycji, gdy brak dopasowania, przy użyciu "g"
  "g" - globalnie, tj. wszystkie wystąpienia
  "i" - ignoruj wielkość liter,
  "o" - wzorzec nie będzie się zmieniał podczas pracy skryptu,
  "m" - dopasuj ^ i $ do każdej linii, a nie do całego wyrażenia,
  "s" - potraktuj nową linię jako znak ("." normalnie nie jej zawiera),
  "x" - pozwól na wystąpienie we wzorcu spacji i komentarzy #.
W przypadku użycia / jako znaku oddzielenia wzorca początkowe m jest opcjonalne, lecz pozwala na zastosowanie innego znaku niż /. Zamiast pisać

	if (/^\/tmp_mnt/)
	{ print "$_ jest automatycznie mountowany\n"; }
można

        if (m!^/tmp_mnt!)
        { print "$_ jest automatycznie mountowany\n"; }
Zamiast konstrukcji /wzor/ można użyć ?wzor?, która jest identyczna z wyjątkiem, że ta ostatnia dopasowuje tylko raz pomiędzy użyciem operatora reset, co jest korzystne optymalizacyjnie do sprawdzenia tylko jednokrotnego wystąpienia. Konstrukcja ?wzor? może być wyrzucona w następnych wersjach Perla.

6.2. Wybieranie odpowiadających ciągów za pomocą regexp

Perl może zwracać podciągi dopasowane do wzorca. Oto przykład:

	$file = "/auto/home/pat/c/utmpdmp.c";
	($base) = ($file =~ m|.*/([^/]+)$|);
Efektem działania tych dwóch linii jest podstawienie pod zmienną $base wartości "utmpdmp.c". Nawiasy w regexp wskazują podciąg do wyodrębnienia i są zarazem oznaczeniem grupowania. Dopasowane kolejne podciagi z wzorca wstawiane są odpowiednio pod zmienne $liczba. Zwracana wartość jest zależna od kontekstu. W kontekście znakowym jest to podciąg, zaś w liczbowym '' lub 1, w zależności od istnienia podciągu. Poniżej jest przykład kontekstu liczbowego. Konstrukcja <STDIN>, opisana później, czyta linie z klawiatury:

	$response = <STDIN>;
	if ($response =~ /^\s*y/i)
	{ print "wpisałeś yes"; }
Należy zwrócić uwagę na typ zwracany przez funkcje. Dokładniej omówione to zostanie później.