Jeśli chcesz rozpocząć przygodę z programowaniem -- zacznij naukę od Perla. Po kilku godzinach pracy przekonasz się, że dokonałeś najlepszego wyboru. Perl posiada wielką zaletę, której brakuje konkurencyjnym narzędziom: nie znając wszystkich jego niuansów możesz pisać działające aplikacje.
Larry Wall stworzył Perla dla osób, które są niecierpliwe (programy w Perlu pisze się bardzo szybko), leniwe (kod programów jest zwięzły, a ich tworzenie ułatwia ogromna liczba gotowych modułów) i chcą być dumne z tego, co robią (sam przekonasz się, jak wiele satysfakcji dostarczy Ci programowanie w Perlu).
Książka przeznaczona jest dla początkujących programistów. Dowiesz się z niej jak zainstalować Perla, a następnie, krok po kroku, ćwiczenie po ćwiczeniu, zagłębisz się w jego świat.
Poznasz:
* Fundamenty języka: zmienne, instrukcje i referencje
* Wyrażenia regularne, umożliwiające szybkie przeszukiwanie tekstów i podmianę fragmentów
* Sposoby korzystania z plików
* Zasady pisania skryptów CGI
* Wysyłanie e-maili za pomocą Perla
* Łączenie Perla z bazami danych
1. IDZ DO
PRZYK£ADOWY ROZDZIA£
SPIS TRE CI Perl. Æwiczenia
praktyczne
KATALOG KSI¥¯EK
Autor: Krzysztof Juszkiewicz
KATALOG ONLINE ISBN: 83-7197-946-0
Format: B5, stron: 132
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
DODAJ DO KOSZYKA Je li chcesz rozpocz¹æ przygodê z programowaniem — zacznij naukê od Perla. Po kilku
godzinach pracy przekonasz siê, ¿e dokona³e najlepszego wyboru. Perl posiada wielk¹
zaletê, której brakuje konkurencyjnym narzêdziom: nie znaj¹c wszystkich jego
CENNIK I INFORMACJE niuansów mo¿esz pisaæ dzia³aj¹ce aplikacje.
Larry Wall stworzy³ Perla dla osób, które s¹ niecierpliwe (programy w Perlu pisze siê
ZAMÓW INFORMACJE bardzo szybko), leniwe (kod programów jest zwiêz³y, a ich tworzenie u³atwia ogromna
O NOWO CIACH liczba gotowych modu³ów) i chc¹ byæ dumne z tego, co robi¹ (sam przekonasz siê, jak
wiele satysfakcji dostarczy Ci programowanie w Perlu).
ZAMÓW CENNIK Ksi¹¿ka przeznaczona jest dla pocz¹tkuj¹cych programistów. Dowiesz siê z niej jak
zainstalowaæ Perla, a nastêpnie, krok po kroku, æwiczenie po æwiczeniu, zag³êbisz siê
w jego wiat.
CZYTELNIA Poznasz:
FRAGMENTY KSI¥¯EK ONLINE • Fundamenty jêzyka: zmienne, instrukcje i referencje
• Wyra¿enia regularne, umo¿liwiaj¹ce szybkie przeszukiwanie tekstów i podmianê
fragmentów
• Sposoby korzystania z plików
• Zasady pisania skryptów CGI
• Wysy³anie e-maili za pomoc¹ Perla
• £¹czenie Perla z bazami danych
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
3. 4 Perl. Ćwiczenia
Rozdział 8. Obsługa plików....................................................................................................................................... 85
Sprawdzanie i zmiana atrybutów ...............................................................................................85
Odczyt i zapis .............................................................................................................................91
Ograniczanie dostępu .................................................................................................................96
Pliki binarne ...............................................................................................................................98
Rozdział 9. WWW........................................................................................................................................................... 101
Moduł CGI ...............................................................................................................................102
Rozdział 10. Poczta elektroniczna .......................................................................................................................... 113
Rozdział 11. Inne usługi sieciowe.......................................................................................................................... 121
Rozdział 12. Bazy danych............................................................................................................................................. 127
4. 7. Rozdział
Wyra enia regularne
Język Perl jest dobrze przystosowany do przetwarzania tekstów. Jego główną zaletą wią ącą
się z tym zagadnieniem są wyra enia regularne. Ich istotą jest tworzenie wzorców opartych
o ró ne symbole. Taki wzorzec jest dopasowywany do testowanego tekstu i w ten sposób
mo na sprawdzać, czy dany tekst zawiera określone litery, znaki, grupy liter, słowa. Opie-
rając się na wykonanym dopasowaniu (lub jego braku) mo na dodatkowo podmienić pa-
sującą frazę na inną.
Sprawdzanie
Ćwiczenie 7.1.
Sprawdź, czy w zmiennej region znajduje się słowo karp.
Rozwiązanie
WUTDKPRGTN
TGIKQP RQFMCTRCEMK
KH
TGIKQP ` MCTR ]
RTKPV ,GUV MCTRP
_
Wartość zmiennej TGIKQP ustawiamy na RQFMCTRCEMK. W tym słowie znajduje się fraza
MCTR, więc efekt sprawdzenia będzie pozytywny i na ekranie powinniśmy zobaczyć napis
wygenerowany przez funkcję RTKPV.
Do obsługi wyra eń regularnych u ywamy operatora składającego się ze znaku równości
i tyldy (`). W niektórych edytorach mogą wystąpić problemy z wpisaniem znaku tyldy
(`), gdy po naciśnięciu odpowiedniego klawisza nie pojawia się on na ekranie. Nale y
wówczas oprócz właściwego klawisza u yć spacji.
5. 70 Perl. Ćwiczenia
Po operatorze wyra enia regularnego piszemy samo wyra enie ujęte w ukośniki (). Wpisa-
nie ciągu liter (tak jak w tym przypadku) spowoduje sprawdzenie, czy w danej zmiennej
zawierającej ciąg znaków (RQFMCTRCEMK) występuje zadany podciąg (MCTR).
Ćwiczenie 7.2.
Zbadaj, czy w zmiennej region nie ma słowa karp.
Rozwiązanie
WUTDKPRGTN
KH
TGIKQP ` MCTR ]
RTKPV $TCM MCTRP
_
KH
TGIKQP ` MCTR ]
RTKPV $TCM MCTRP
_
WPNGUU
TGIKQP ` MCTR ]
RTKPV $TCM MCTRP
_
W tym przypadku przedstawiono trzy alternatywne rozwiązania. Są one równowa ne.
W pierwszym wierszu widzimy, e zastosowano operator `. Sprawdzamy zatem, czy
gdziekolwiek w zmiennej TGIKQP nie ma układu liter MCTR. Ten sam efekt uzyskamy sto-
sując wykrzyknik przed warunkiem (warunek drugi) oraz dzięki u yciu warunku nega-
tywnego WPNGUU (jeśli nie).
Ćwiczenie 7.3.
Prześledź, czy słowo karp znajduje się w zmiennej domyślnej.
Rozwiązanie
WUTDKPRGTN
A RQFMCTRCEMK
KH
MCTR ]
RTKPV ,GUV MCTRP
_
Zmienna domyślna to taka, której nazwa składa się jedynie z podkreślenia (A). Jeśli w takiej
zmiennej umieścimy nasz tekst do sprawdzenia (RQFMCTRCEMK), nie trzeba stosować ope-
ratora wyra enia regularnego (`), wystarczy jedynie samo wyra enie w ukośnikach.
Ćwiczenie 7.4.
Przeanalizuj, czy odpowiedź zawarta w zmiennej odp jest twierdząca.
6. Rozdział 7. Wyra enia regularne 71
Rozwiązanie
WUTDKPRGTN
KH
QFR ` VCM ]
RTKPV ,GUV 1-P
_
Sprawdzamy tutaj za pomocą wyra enia regularnego, czy odpowiedź zawiera słowo VCM. Nie
mo emy mieć jednak pewności, czy odpowiedzią (wartość zmiennej QFR) nie była na
przykład VCMV[MC lub VCMPKG. Powinniśmy zatem zastosować jeden z poni szych wierszy.
WUTDKPRGTN
KH
QFR GS VCM ]
RTKPV ,GUV 1-P
_
KH
QFR ` @VCM ]
RTKPV ,GUV 1-P
_
W pierwszym wierszu widzimy porównanie (GS) wartości zmiennej QFR i ciągu znaków VCM,
natomiast w drugim warunku mamy do czynienia z adekwatnym wyra eniem regularnym.
Zastosowanie daszka (@) i dolara ( ) oznacza w tym przypadku odpowiednio początek
i koniec ciągu znaków. Innymi słowy, chcemy by słowo tak było dokładnie tym, co znajduje
się w zmiennej QFR. Właśnie po to stosujemy znaki daszka i dolara.
Istnieje jednak nadal mo liwość, e odpowiedź była twierdząca, a my tego nie stwierdzimy.
Stanie się tak, gdy zmienna QFR będzie miała przykładowo wartość 6#- lub 6CM. Zaradzimy
takiemu zjawisku u ywając innej konstrukcji.
WUTDKPRGTN
KH
QFR ` @VCM K ]
RTKPV ,GUV 1-P
_
Ró ni się ona od poprzedniej literą K, występującą po drugim ukośniku wyra enia re-
gularnego. Dzięki temu przy porównywaniu du e i małe litery traktowane są tak samo,
czyli słowa 6#- i VCM są równowa ne.
Ćwiczenie 7.5.
Sprawdź, czy w zmiennej adres występuje cyfra 2.
Rozwiązanie
WUTDKPRGTN
CFTGU $CLMQYC O
KH
CFTGU ` ]
RTKPV ,GUV FYCP
_
Wartości liczbowe w języku Perl traktowane są tak samo jak znaki, dlatego w wyra eniach
regularnych mo emy u ywać równie cyfr, w taki sam sposób jak liter.
7. 72 Perl. Ćwiczenia
Ćwiczenie 7.6.
Ustal, czy w adresie występuje ukośnik.
Rozwiązanie
WUTDKPRGTN
CFTGU $CLMQYC
KH
CFTGU ` ]
RTKPV /KGUMCPKG Y DNQMWP
_
Wyra enia regularne umieszczamy w ukośnikach (). Jeśli chcemy umieścić ukośnik
w tak zapisanym wyra eniu regularnym, musimy go poprzedzić odwrotnym ukośnikiem ().
W ten sposób zapis () staje się dość nieczytelny. Mo emy jednak zmienić sposób
zapisu wyra enia, zmieniając znaki ograniczające to wyra enie () na dowolne inne (z wy-
jątkiem liter i cyfr), np. na kreskę pionową (^).
WUTDKPRGTN
CFTGU $CLMQYC
KH
CFTGU ` O^^ ]
RTKPV /KGUMCPKG Y DNQMWP
_
Warunkiem zmiany ograniczającego ukośnika na inny znak jest umieszczenie przed wyra e-
niem litery O. Czasem mo na te spotkać zapis wyra enia regularnego z ukośnikami i literą O
(O). Nie jest on błędny, lecz — jak widać w poprzednich ćwiczeniach — nadmiarowy.
Ćwiczenie 7.7.
Sprawdź, czy numer domu lub mieszkania jest równy .
Rozwiązanie
WUTDKPRGTN
CFTGU $CLMQYC O
KH
CFTGU ` ]
RTKPV ,GUV FYCP
_
Za zadanie mamy sprawdzić, czy w zmiennej zawierającej adres występuje liczba . Spo-
dziewamy się, e mogą wystąpić tu dwie liczby, z których przynajmniej jedna jest równa
dwa. Nie mo na jako wyra enia regularnego w tym przypadku u yć , gdy moglibyśmy
wówczas jako dwa potraktować liczbę, której jedną z cyfr jest dwa (np. ). Zastosujemy
zatem sprawdzanie, czy w zmiennej QFR znajduje się fraza składająca się z dwóch spacji,
pomiędzy którymi występuje cyfra .
Przedstawione rozwiązanie nie jest jednak tym, które spełnia warunki zadania. Poprawny
zapis wyra enia regularnego znajduje się poni ej.
8. Rozdział 7. Wyra enia regularne 73
WUTDKPRGTN
CFTGU $CLMQYC
KH
CFTGU ` DD ]
RTKPV ,GUV FYCP
_
Widzimy tu, e niekoniecznie przed oraz za liczbą dwa musi wystąpić spacja. W tej sytuacji
zamiast spacji nale y zastosować ograniczenie słowa (D). Jest to analogiczna konstrukcja,
jak w przypadku początku i końca frazy (@ ).
Ćwiczenie 7.8.
Zbadaj, czy któryś z numerów w adresie jest parzysty.
Rozwiązanie
WUTDKPRGTN
CFTGU $CLMQYC
KH
CFTGU ` =?D ]
RTKPV ,GUV RCT[UVCP
_
Liczba parzysta to taka, która kończy się cyfrą parzystą, czyli jedną ze zbioru: 0, 2, 4, 6, 8.
Rozwiązanie jest bardzo podobne do poprzedniego, z tą ró nicą, e mamy odpowiedzieć
na pytanie o ostatnią cyfrę. Dlatego występuje tu tylko jedno ograniczenie końca wyrazu D.
Zamiast sprawdzania, czy wystąpiła tylko jedna cyfra, sprawdzamy, czy nie wystąpił jeden
z pięciu wymienionych znaków (w tym przypadku cyfr). Robimy to przy u yciu oznaczenia
klasy znaków w języku Perl, u ywając nawiasów kwadratowych =?.
Ćwiczenie 7.9.
Prześledź, czy w adresie nie występuje liczba nieparzysta.
Rozwiązanie
WUTDKPRGTN
CFTGU $CLMQYC
KH
CFTGU ` =?D ]
RTKPV $TCM PKGRCT[UVGLP
_
Analogicznie jak poprzednio, musimy za pomocą D ustalić, jaki jest ostatni znak wyrazu
i czy nie jest on nieparzysty.
Ćwiczenie 7.10.
Jeśli w adresie jest liczba parzysta, znajdź ją.
10. =?D ]
RTKPV ,GUV RCT[UVC P
_
W poprzednim ćwiczeniu u ywaliśmy wyra enia =?D. Teraz dodaliśmy F
11. , a tak e
ujęliśmy wszystko w nawiasy.
Kombinacja F oznacza wystąpienie dowolnej cyfry i jest równoznaczna z zapisem
=?, który w skrócie wygląda następująco — =?.
Gwiazdka (
12. ) w wyra eniach regularnych oznacza, e poprzedzające ją wyra enie nie
musi wcale wystąpić lub mo e się pojawić wielokrotnie (czyli 0 lub więcej razy). W naszym
przypadku przed ostatnią cyfrą parzystą mo e pojawić się w liczbie wiele innych cyfr, co
nie będzie miało znaczenia dla parzystości szukanej liczby.
Jeśli w adresie jest liczba parzysta, jej wartość znajdzie się w zmiennej , którą następnie
wyświetlamy. Ciąg znaków poprzedzający dopasowanie znajdzie się w B, zaś wystę-
pujący po — w zmiennej . Interpreter zawsze znajduje w takiej sytuacji tylko pierwsze
miejsce, w którym spełniony jest zadany warunek.
Ćwiczenie 7.11.
Znajdź obie lub jedną liczbę parzystą w adresie.
Rozwiązanie
WUTDKPRGTN
CFTGU $CLMQYC
KH
CFTGU `
F
15. =?D! ]
RTKPV ,GUV RCT[UVC P
_
Wyra enie regularne ma tu postać podobną jak poprzednio, lecz powtórzone zostały dwu-
krotnie sekwencje F
16. =?D. Obie ujęto w nawiasy, a po drugiej dodano znak zapyta-
nia. Dzięki niemu ta druga sekwencja oznaczająca liczbę parzystą mo e, lecz nie musi, wy-
stąpić, co pozwala nam znaleźć jedną lub obie liczby parzyste, w zale ności od tego, ile
ich wystąpiło.
Pomiędzy liczbami powinny znaleźć się jakieś znaki nie będące cyframi (symbol ), o ile
w adresie są dwie liczby.
Zastosowanie nawiasów w wyra eniu regularnym spowoduje, e w przypadku, gdy spraw-
dzanie ciągu się powiedzie (u nas — gdy w adresie wystąpi co najmniej jedna liczba pa-
rzysta), po sprawdzeniu ustawione zostaną zmienne, których nazwy są liczbami. Kolejne
zmienne odpowiadają kolejności u ytych nawiasów. Efektem działania programu będzie
napis:
,GUV RCT[UVC
17. Rozdział 7. Wyra enia regularne 75
Wartości zmiennych o nazwach liczbowych są kasowane przed u yciem kolejnego wy-
ra enia regularnego, dlatego nale y ich wartości zachowywać w innych zmiennych, na
przykład za pomocą następującego zapisu:
WUTDKPRGTN
CFTGU $CLMQYC
CFTGU `
F
23. =?D!
Ćwiczenie 7.12.
Wyświetl kolejno wszystkie liczby parzyste w adresie.
Rozwiązanie
WUTDKPRGTN
CFTGU $CLMQYC
YJKNG
CFTGU `
F
24. =?DI ]
RTKPV P
_
Wartość zmiennej CFTGU jest dopasowywana do znanego nam ju wzorca F
25. =?.
Tym razem jednak po wyra eniu regularnym pojawiła się litera I, oznaczająca konieczność
przeszukania całego ciągu, nie zaś — jak poprzednio — tylko pierwszego miejsca, które
pasuje do wzorca. Na ekranie zobaczymy następujące linie wygenerowane przez program:
Ćwiczenie 7.13.
Poka wszystkie liczby znajdujące się na początku kolejnych wierszy.
Rozwiązanie
WUTDKPRGTN
YKGTUG P PP
YJKNG
YKGTUG ` @
F
IO ]
RTKPV P
_
W zmiennej YKGTUG umieszczono cztery liczby w trzech wierszach (trzy znaki nowej
linii). Wyra enie @
F
będzie pasować jedynie do jednej liczby znajdującej się na po-
czątku zmiennej, nawet w przypadku zastosowania modyfikatora I, u ytego w poprzednim
26. 76 Perl. Ćwiczenia
ćwiczeniu. Dzieje się tak, poniewa znaki @ i oznaczają końce wartości całej zmiennej.
Dodanie modyfikatora O spowoduje, e wspomniane znaki odnosić się będą do podziału
wyznaczonego przez końce linii. Wydruk na ekranie będzie się przedstawiał następująco:
Ćwiczenie 7.14.
Znajdź czwarty znak w zmiennej adres.
Rozwiązanie
WUTDKPRGTN
CFTGU $CLMQYC
PCM
CFTGU ` ]_
RTKPV PCM
W wyra eniu regularnym widzimy kropkę, która zastępuje dowolny znak. Po niej w na-
wiasach klamrowych jest liczba , oznaczająca, e poprzedzający ją znak musi wystąpić
dokładnie trzy razy. Następnie znowu jest kropka, w zwykłych nawiasach. Dzięki temu po
dopasowaniu do wyra enia regularnego ustawiona zostanie zmienna o wartości rów-
nej czwartemu znakowi. Ponadto ten znak zostanie zwrócony i podstawiony do zmien-
nej PCM, a na ekranie zobaczymy literę M.
Zastosowanie wyra enia regularnego do tego typu problemu nie jest najlepszym rozwiąza-
niem. Lepiej u yć funkcji UWDUVT.
WUTDKPRGTN
CFTGU $CLMQYC
PCM UWDUVT
CFTGU
Ćwiczenie 7.15.
Znajdź wszystkie cyfry znajdujące się w zmiennej liczba przed cyfrą 0.
Rozwiązanie
WUTDKPRGTN
NKEDC
RTKPV NKEDC `
F
27. W zmiennej NKEDC cyfra zero występuje dwukrotnie. Stosując wzorzec
F
28. otrzymujemy
największe mo liwe dopasowanie, czyli zawierające pierwsze zero. Efektem działania funkcji
RTKPV będzie liczba .
Gdy chcemy otrzymać najmniejsze dopasowanie, nale y po gwiazdce dodać znak zapytania.
W naszym przypadku, jeśli chcemy otrzymać liczbę , wzorzec powinien mieć postać
F
32. ) wystąpienie cyfr od do .
Ćwiczenie 7.16.
Sprawdź, czy w zmiennej region jest ciąg liter umieszczony w zmiennej fragment.
Rozwiązanie
WUTDKPRGTN
TGIKQP RQFMCTRCEMK
HTCIOGPV MCTR
KH
TGIKQP ` HTCIOGPV ]
RTKPV ,GUV EKæI HTCIOGPVP
_
W pierwszych dwóch wierszach ustawiamy wartości zmiennych TGIKQP i HTCIOGPV odpo-
wiednio na RQFMCTRCEMK oraz MCTR. Na początku tego rozdziału zastosowaliśmy warunek
TGIKQP ` MCTR. Teraz zamiast słowa MCTR stosujemy wartość zmiennej HTCIOGPV,
która go zawiera.
Takie zastosowanie wyra enia regularnego jest dość wygodne, lecz mo e wydłu yć czas
wykonywania skryptu, gdy przed ka dym dopasowaniem wyra enia regularnego (na
przykład w pętli) interpreter musi sprawdzić, czy wartość zmiennej HTCIOGPV nie uległa
zmianie. Wiedząc, e wartość zmiennej nie ulega zmianie, programista mo e wyłączyć
sprawdzanie dodając literę o po wyra eniu regularnym, tak by ostatni wiersz miał nastę-
pującą postać:
WUTDKPRGTN
KH
TGIKQP ` HTCIOGPVQ ]
RTKPV ,GUV EKæI HTCIOGPVP
_
Ćwiczenie 7.17.
Do zmiennej fragment wstaw nawias i sprawdź, czy występuje on w zmiennej region.
Rozwiązanie
WUTDKPRGTN
TGIKQP
RQFMCTRCEMK
HTCIOGPV
KH
TGIKQP ` HTCIOGPVQ ]
RTKPV ,GUV EKæI HTCIOGPVP
_
Nawias w wyra eniu regularnym ma znaczenie grupujące, dlatego nale y go poprzedzić
odwrotnym ukośnikiem. Jego pominięcie spowoduje błąd, wyglądający jak poni ej:
WPOCVEJGF
KP TGIGZR
33. 78 Perl. Ćwiczenia
U ycie odwrotnego ukośnika jest nieeleganckie, gdy funkcja RTKPV da na ekranie mylący
efekt.
,GUV EKæI
Innym sposobem jest wyłączenie znaczenia znaków specjalnych w wyra eniu regularnym.
Po modyfikacji rozwiązanie będzie miało następującą postać:
WUTDKPRGTN
TGIKQP
RQFMCTRCEMK
HTCIOGPV
KH
TGIKQP ` 3 HTCIOGPV'Q ]
RTKPV ,GUV EKæI HTCIOGPVP
_
Wspomniane wyłączenie będzie miało miejsce od znaków 3 do znaków '. Mo na te
sekwencje stosować wielokrotnie.
Zamiana
Ćwiczenie 7.18.
Zamień w zmiennej wladca słowo Kazimierz na Stefan.
Rozwiązanie
WUTDKPRGTN
YNCFEC -CKOKGT $CVQT[
YNCFEC ` U-CKOKGT5VGHCP
Za pomocą wyra eń regularnych mo emy nie tylko sprawdzić, czy dane wyra enie wy-
stępuje, lecz równie dopasowane wyra enie zastąpić innym. Słu y do tego operator U,
analogiczny do operatora sprawdzania — O.
W przypadku zamiany z wykorzystaniem wyra enia regularnego nale y podać dwa wzorce,
jeden do dopasowania (u nas -CKOKGT), drugi do zamiany (5VGHCP). Po zamianie warto-
ścią zmiennej YNCFEC będzie 5VGHCP $CVQT[.
Ćwiczenie 7.19.
Usuń ze zmiennej znaczki wszystkie białe znaki na początku i końcu jej wartości.
Rozwiązanie
WUTDKPRGTN
PCEMK VGMUV VGUVQY[
PCEMK ` U@U
PCEMK ` UU
RTKPV PCEMK
34. Rozdział 7. Wyra enia regularne 79
W pierwszym wierszu usuwamy białe znaki (U) występujące na początku (@) zmiennej
PCEMK. Plus (
) oznacza konieczność co najmniej jednokrotnego wystąpienia któregoś
z białych znaków. Mo e to być spacja, tabulacja lub znak nowej linii. Analogicznie w drugim
wierszu pozbywamy się znaków przed końcem ( ) wartości zmiennej. Białe znaki w środku
tekstu pozostaną niezmienione, a na ekranie zobaczymy:
VGMUV VGUVQY[
Istnieją równie dwa ró ne sposoby realizacji tego zadania, przy zastosowaniu zapisu
jednolinijkowego. Są one jednak e wolniejsze w działaniu ni poprzednie rozwiązanie.
WUTDKPRGTN
PCEMK VGMUV VGUVQY[
PCEMK ` U@U
36. W związku z tym, e nale y przyjąć, i białe znaki mogą wystąpić jedynie z jednej strony,
nale y zamiast plusa (
) u yć gwiazdki (
37. ). W ten sposób dopuszczamy brak wystąpienia
białego znaku.
W pierwszej wersji korzystamy z zamiany pewnej ograniczonej liczby (
38. !) dowolnych
znaków () na te same znaki, ale bez otaczających białych znaków. Zamiana jest dokony-
wana poprzez zastosowanie nawiasów i wykorzystanie wartości zmiennej tymczasowej ( ).
WUTDKPRGTN
PCEMK VGMUV VGUVQY[
PCEMK ` U@U
40. I
Drugi sposób opiera się na zamianie białych znaków na nic. Dodatkowo sprawdzane jest,
czy występują one na początku lub (^) na końcu zmiennej.
Ćwiczenie 7.20.
Zamień znaki końca linii sytemu uniksowego na znaki końca linii w systemie Windows.
Rozwiązanie
PCEMK ` UPTPIO
Dla systemu uniksowego znak końca linii w języku Perl zapisujemy za pomocą wyra enia
P, natomiast dla Windows są to dwa znaki — TP. Nale y pamiętać, e w tym przy-
padku jeden znak zastępujemy dwoma, z których jeden to ten sam znak. Modyfikatory (litery
na końcu) IO są konieczne w przypadku występowania w zmiennej PCEMK wielu znaków
nowej linii.
Ćwiczenie 7.21.
Zamień numery miesięcy na ich nazwy.
Rozwiązanie
WUTDKPRGTN
PCY[
UV[EPKC NWVGIQ OCTEC MYKGVPKC OCLC EGTYEC NKREC
UKGTRPKC YTG PKC RC FKGTPKMC NKUVQRCFC ITWFPKC
41. 80 Perl. Ćwiczenia
VGMUV 2T[UGF 4QRQEæ RTCEú K RTCEQYC FQ P
VGMUV ` U
F
PCY[= ? I
RTKPV VGMUV
Na początku tworzymy tablicę PCY[ z nazwami miesięcy w odpowiednim przypadku.
Następnie do zmiennej VGMUV wstawiamy dwa zdania z trzema datami. Trzeci wiersz to
właściwa zamiana.
Szukamy wzorca rozpoczynającego się minusem (), następnie przynajmniej jedna cyfra
(F
) i potem znowu minus. Celem zamiany jest odstęp (spacja), wartość pewnej zmiennej
i znowu spacja. Po dopasowaniu do wzorca pod zmienną podstawione zostanie wyra enie
pasujące do fragmentu wzorca w nawiasach. Będzie to liczba oznaczająca numer miesiąca.
Poniewa pierwszy miesiąc w tablicy PCY[ ma numer zero, więc od zmiennej nale y od-
jąć jeden ( ). Nazwa miesiąca pobrana z tablicy PCY[ ma właśnie taki numer i jest
u ywana przy zamianie. Efekt podmiany mo na zobaczyć na ekranie.
2T[UGF UV[EPKC 4QRQEæ RTCEú OCTEC K RTCEQYC FQ NKUVQRCFC
Dzielenie
Ćwiczenie 7.22.
Wstaw do tablicy slowa kolejne słowa z wyra enia zawartego w zmiennej tekst.
Rozwiązanie
WUTDKPRGTN
VGMUV 6W PCLFWLG UKú RKúè U ÎY
UNQYC URNKV
U
VGMUV
RTKPV LQKP
P UNQYC
Wyra enia regularne mo na stosować tak e do konwersji zmiennej skalarnej na tablicę.
Słu y do tego funkcja URNKV, której jako pierwszy argument podajemy wyra enie regu-
larne, a jako drugi — zmienną, na której podział ma być dokonany. W tym przypadku
poszczególne elementy tablicy UNQYC są oddzielone białymi znakami (zazwyczaj słowa
oddzielamy spacjami). Pominięcie plusa, występującego w pierwszym wierszu, mo e spo-
wodować, e niektóre elementy tablicy UNQYC będą puste. Stanie się tak, gdy obok siebie
znajdą się co najmniej dwa białe znaki.
Przeciwne działanie do funkcji URNKV ma funkcja LQKP. Dzięki tej drugiej mo emy tablicę
połączyć w zmienną skalarną, wstawiając pomiędzy elementy podany ciąg znaków (nie
wyra enie regularne). U nas będzie to znak nowej linii, czyli kolejne elementy tablicy
UNQYC zobaczymy na ekranie w kolejnych wierszach.
6W
PCLFWLG
UKú
RKúè
U ÎY
42. Rozdział 7. Wyra enia regularne 81
Ćwiczenie 7.23.
Wstaw do tablicy litery kolejne znaki ze zmiennej tekst.
Rozwiązanie
WUTDKPRGTN
VGMUV #$%ECD
NKVGT[ URNKV
VGMUV
RTKPV LQKP NKVGT[
W przypadku, gdy u ywamy funkcji URNKV i podamy jej puste wyra enie regularne, w wy-
nikowej tablicy (NKVGT[) otrzymamy kolejne znaki ze zmiennej VGMUV. Elementami tablicy
będą wszystkie znaki, a nie jedynie litery. W naszym przypadku na ekranie zobaczymy je
oddzielone przecinkami, dzięki funkcji LQKP.
#$%ECD
Transliteracja
Ćwiczenie 7.24.
Zamień wszystkie litery typowe dla języka polskiego na ich obce odpowiedniki.
Rozwiązanie
WUTDKPRGTN
VGMUV Î MPæ NGF
VGMUV ` VTæèú Î äçù ¦ CEGNPQU#%'.015
RTKPV VGMUV
W Perlu istnieje operator transliteracji VT (zapisywany tak e jako [). Jego działanie polega
na zamianie wszystkich znaków ze wzorca na odpowiadające im znaki ze wzorca zamiany.
W naszym przypadku wszystkie litery æ zostaną zastąpione literami C, è zamienione zostaną
na E, ú na G itd. Na ekranie w tym przypadku zobaczymy następujący napis:
QNMPCN UNGF
Ćwiczenie 7.25.
Zamień wszystkie wielkie litery na małe.
Rozwiązanie
WUTDKPRGTN
VGMUV 0C M.C9+CVW4G L'U6 MN#Y+U 5*+(6
VGMUV ` [#C
RTKPV VGMUV
43. 82 Perl. Ćwiczenia
Wykorzystamy tu operator transliteracji VT, lecz zapisany krócej (i równowa nie) jako [.
Zestaw wszystkich wielkich liter uzyskujemy stosując konstrukcję # i analogicznie otrzy-
mamy zestaw małych liter. Efekt mo na zobaczyć na ekranie.
PC MNCYKCVWTG LGUV MNCYKU UJKHV
Ta zamiana nie uwzględnia liter typowych dla języka polskiego. Nale y dla nich wykonać
dodatkową operację transliteracji.
WUTDKPRGTN
VGMUV RK5äE W [Y# -NC9KU# 5*+(6
VGMUV ` [#C
VGMUV ` VTäçù ¦ æèú Î
RTKPV VGMUV
Tym razem nasz tekst będzie wyglądał tak:
RKUæE W [YC MNCYKUC UJKHV
Ćwiczenie 7.26.
Policz, ile razy w zmiennej tekst występuje litera a.
Rozwiązanie
WUTDKPRGTN
VGMUV CDDCE
NKEDC VGMUV ` [C
RTKPV 9 VGM EKG VGMUV NKVGTC C Y[UVæRK C NKEDC TC[P
Liczba znaków we wzorcu i specyfikacji zamiany nie musi być równa. Litery C w naszym
przypadku nie zostaną zamienione, a na ekranie zobaczymy następującą informację:
9 VGM EKG CDDCE NKVGTC C Y[UVæRK C TC[
Ćwiczenie 7.27.
Wyrzuć powtarzające się obok siebie znaki ze zmiennej tekst.
Rozwiązanie
WUTDKPRGTN
VGMUV CDDCE
VGMUV ` VTC#U
RTKPV VGMUV
Zastosowanie modyfikatora U (litera na końcu) dla operatora VT powoduje, e wszystkie
takie same znaki znajdujące się obok siebie traktowane są podczas zamiany jako jeden.
Dzięki zastosowaniu operacji zapisanej powy ej, zamianie (kasowaniu duplikatów) ulegną
tylko litery. Pojawi się następująca wartość zmiennej:
CDCE
44. Rozdział 7. Wyra enia regularne 83
Nale y zwrócić uwagę, e usunięte zostały jedynie litery znajdujące się obok siebie. Litera C
występowała dwukrotnie i tak jest nadal. Usuwanie wszystkich powtórzeń spowoduje zapis
przedstawiony poni ej.
WUTDKPRGTN
VGMUV CDDCE
VGMUV ` VTEU
RTKPV VGMUV
We wzorcu nie ma wpisanych adnych znaków. Jednak e dzięki modyfikatorowi E, ozna-
czającemu odwrócenie dopasowania wzorca, operator VT wykona zadane operacje na ka dym
znaku. Nie będzie to zamiana (wzorzec zamiany jest pusty), lecz usunięcie powtórzeń
(modyfikator U). Tym razem efekt będzie inny.
CDCE
Operator VT mo e w tym przypadku zostać zastąpiony przez operator zamiany U.
WUTDKPRGTN
VGMUV CDDCE
VGMUV ` U
I
Widzimy tu dowolny znak oznaczony kropką ujętą w nawiasy. W ten sposób dla ka dego
znaku (modyfikator g) ustawiona zostaje zmienna , której wartością jest ten znak. Usta-
wionej zmiennej nie mo na jednak u ywać w lewej części operatora (we wzorcu). Zamiast
niej u ywa się odpowiadającego jej wyra enia — . Zatem sekwencja
oznacza
dowolny znak, a po nim ten sam znak, występujący co najmniej raz (znak
). Zestaw takich
samych znaków zostanie zamieniony na jednokrotne wystąpienie znaku ( ).