ďťż

Blog literacki, portal erotyczny - seks i humor nie z tej ziemi


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.
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • qualintaka.pev.pl
  •