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.