Co jest grane
Wst p
Na bazie ASCII
Wy wietlanie wyniku wyszukiwania
Porównanie zapytania...
Sztuczki w HTML-u
Ksi ka go ci
Automatyczna poczta
Przepis na szybki skrypt
Na bazie ASCII
W naszym przykładzie baza danych ma format pliku tekstowego, który mo e by utworzony za
pomoc najprostszego edytora tekstu. Mo emy równie posłu y si arkuszem kalkulacyjnym, któ-
ry potrafi eksportowa dane do pliku TXT.
Baza danych składa si z pewnej liczby wierszy. Ka dy z nich odpowiada jednemu rekordowi,
czyli pojedynczemu zestawowi danych opisuj cych jeden film. Ka dy rekord z kolei zawiera pola
oddzielone znakami |. Na potrzeby naszego repertuaru kinowego stworzymy nast puj ce pozycje:
data, godzina, tytul_filmu, opis. Nasza baza b dzie miała wówczas posta :
05.04.2000|20:00|Dr iwago|Wyciskacz łez05.04.2000|23:00|Godzina duchów|Horror
Po przygotowaniu informacji musimy je w odpowiedniej postaci zaprezentowa go ciom od-
wiedzaj cym nasz witryn . W tym wypadku u ytkownik chc cy znale film musi wpisa w for-
mularzu strony WWW dat i godzin planowanego wyj cia do kina. Nast pnie wy wietlana jest
lista filmów spełniaj cych podane kryteria. Je li o danej porze nic nie jest grane, powinien pojawi
si odpowiedni komunikat.
Formularz umo liwiaj cy zadanie pytania znajduje si na stronie wyszukiwanie.html i ma nast -
puj c posta :
<form method="post" action="/cgi-bin/szukaj.pl"><p>Prosz poda dat w postaci
dd.mm.rrrr</p><p> <input type="text" name="data_wyszukiwania" size="10"
maxlength="10"></p><p> <input type="submit" name="Submit" value="Submit"> <input
type="reset" name="Submit2"value="Reset"></p></form>
Po wysłaniu formularza na serwerze uruchamiany jest skrypt szukaj.pl, który - razem z demon-
stracyjn baz danych i plikami HTML - znajduje si na płycie CD- -ROM doł czonej do bie cego
numeru CHIP-a. Pami tajmy o tym, e w skryptach musimy poda poprawne cie ki dost pu do
folderu instalacyjnego Perla i do pliku bazy danych.
Serwer WWW wył cznie przekazuje dane do skryptu CGI oraz je od niego odbiera. Obsługa
zapytania zadanego przez u ytkownika (przeszukanie bazy danych, odpowiednie sformato-
wanie znalezionych informacji) nale y do skryptu CGI.
Przyjrzyjmy si teraz skryptowi szukaj.pl uruchamianemu przez formularz. Podobnie jak w
przykładzie z pierwszej cz ci kursu, przesłane dane musz zosta przetworzone przez procedur
GetFormInput do postaci nadaj cej si do dalszej analizy. W naszym przypadku jej wynik zapisy-
wany jest w zmiennej o nazwie $data_wyszukiwania
Na pocz tku skryptu, w cz ci konfiguracyjnej, podana jest lokalizacja pliku bazy danych. W
przypadku Linuksa wpis ten mo e wygl da na przykład tak:
$program='/usr/local/apache/htdocs/dane/program.dat';
W systemie Windows mo emy spotka si z nast puj cym zapisem:
$program='c:\programy\apachehtdocs\dane\program.dat';
Wa ne jest, aby w wierszu tym u y apostrofów, poniewa tylko wtedy Perl nie b dzie próbo-
wał interpretowa tre ci w cudzysłowie. Odwrotny uko nik (backslash) jest tak zwanym znakiem
specjalnym, wi c je li chcemy wpisa go pomi dzy znakami cudzysłowu, musi by poprzedzony
znakiem \. Cały wpis wygl da wówczas nast puj co:
$program="c:\\programy\\apache\htdocs\\dane\\program.dat";
Zalet takiego zapisu jest mo liwo wyra enia fragmentu cie ki dost pu za pomoc zmiennej,
któr oczywi cie wcze niej musimy zdefiniowa . Mamy wówczas do czynienia z konstrukcj w
rodzaju:
$program="serverroot\\dane\program.dat";
Pomi dzy znakami apostrofu Perl zinterpretowałby symbol $ jako zwykły znak tekstowy, a nie
jako pocz tek zmiennej.
Je li korzystamy z programu Active Perl przedstawionego w pierwszej cz ci kursu, wówczas
pod Windows równie powinni my zapisywa cie ki dost pu w formacie linuksowym, czyli:
$program='c:/programy/apache/htdocs/dane/program.dat';
U ytkownicy Linuksa i Windows NT/2000 musz pami ta o nadaniu wła ciwych praw dost pu
plikom oraz folderom. Je li chcemy, aby wła ciciele kin mogli samodzielnie uzupełnia baz da-
nych przez Internet za po rednictwem formularza, wówczas u ytkownik, z którego uprawnieniami
pracuje serwer WWW, musi mie prawo zapisu do pliku program.dat
Szczególn ostro no nale y zachowa , je eli skrypty Perla tworz , modyfikuj i kasuj pliki.
Nigdy nie powinni my zezwala na wykonywanie takich operacji w katalogu ródłowym serwera
(zazwyczaj jest to folder o nazwie htdocs lub wwwroot). Tak jak w naszym przykładzie, musimy
utworzy do tego celu specjaln kartotek .
Zanim skrypt rozpocznie przeszukiwanie bazy danych, odpowiednia procedura sprawdza, czy
u ytkownik wpisał dat we wła ciwy sposób. W naszym przykładzie powinna ona mie form
dd.mm.rrrr, czyli dwie cyfry.dwie cyfry.cztery cyfry. Je li wpisany został inny ci g znaków, wy-
wietlony zostanie odpowiedni komunikat.
wietlanie wyniku wyszukiwania
W kolejnym kroku przygotujemy dokument HTML słu cy do prezentowania rezultatów przeszu-
kiwania bazy danych. Strona b dzie w cało ci tworzona dynamicznie przez skrypt, wobec czego
musimy pami ta , aby przed wypisaniem jej zawarto ci wysła tzw. nagłówek HTTP. O tym, jak
si go tworzy, pisali my w pierwszej cz ci kursu.
Nast pnie skrypt generuje kod HTML-a odpowiadaj cy tabeli. Na pocz tku umieszczamy nazwy
poszczególnych kolumn:
Lp., Godzina, Tytuł i Opis. Wła ciwe wiersze tabeli dodawane s sukce-
sywnie w trakcie znajdowania kolejnych pozycji.
Najpierw skrypt otwiera do odczytu plik okre lony w zmiennej $program. Je li operacja otwar-
cia bazy si nie powiedzie, zostanie wykonana procedura znajduj ca si za znakiem || (lub). Funkcja
die zapisuje odpowied do standardowego wyj cia dla komunikatów bł du. W przypadku skryptów
CGI informacje o bł dach s dopisywane do pliku error-log serwera WWW. Je li wynik działania
programu nie odpowiada naszym oczekiwaniom, powinni my sprawdzi zawarto tego zbioru.
Matt's Script Archive to jedno z najlepszych ródeł darmowych skryptów CGI.
Open(DANE,"<$program") || die"Otwarcie pliku $program nie powiodło si \n";
Zmienna DANE pełni tutaj funkcj tak zwanego uchwytu plików (file handler), czyli identyfiku-
je otwarty zbiór. Za po rednictwem DANE uzyskujemy dost p do zawarto ci pliku, którego nazwa
jest okre lona w zmiennej $program. Symbol < umieszczony przed nazw zbioru oznacza, e
otworzymy plik do odczytu. Gdyby my zast pili go znakiem > lub nie wstawili w tym miejscu ni-
czego, zbiór zostałby otwarty do zapisu. Z kolei u ycie >> spowodowałoby, e dane przekazywane
do zmiennej DANE byłyby dopisywane do pliku. Kombinacja +< lub +> pozwala na jednoczesny
zapis i odczyt.
W pierwszym przykładzie chcemy odczytywa dane i porównywa je z tre ci zapytania u yt-
kownika. Proces ten podzielony jest na wiele małych kroków.
Porównanie zapytania z zawarto ci bazy
Zawarto pliku okre lonego w DANE jest wczytywana do listy @lista_danych. Ka dy wiersz na-
szej bazy danych stanowi jeden element listy. Poniewa wszystkie linie zawieraj znaki ko ca wier-
sza (\n), za pomoc polecenia chop odcinamy ostatni znak od ka dego elementu listy. W naszym
przypadku mogliby my zrezygnowa z tej operacji, jednak nie robimy tego po to, by zapozna si z
konstrukcj p tli foreach @element_listy (@lista) {blok programu} oraz z poleceniem chop
@lista_danych=<DANE>;foreach $wiersz(@lista_danych){ chop $wiersz;
Teraz rozpoczyna si wła ciwe wyszukiwanie. Poniewa w pierwszej cz ci poznali my ju
sposób działania p tli for(licznik) {}, a przed chwil zetkn li my si z konstrukcj foreach{}, dlate-
go tym razem u yjemy p tli while{}.
Wcze niej zdefiniujemy jeszcze dwie zmienne: $i b dzie licznikiem p tli, dzi ki któremu b -
dziemy mogli odczyta ka dy element listy @lista_danych. Poniewa do pierwszego elementu tej
listy odwołujemy si za pomoc @lista_danych[0], p tla rozpoczyna si od warto ci $i=0. Druga
zmienna $zgodne informuje nas, czy wyszukiwanie zostało zako czone sukcesem. Pocz tkowa
warto tej zmiennej równa jest zero i nie zmienia si , dopóki nie zostanie znaleziony element speł-
niaj cy kryteria wyszukiwania.
Działanie programu mo na wytłumaczy nast puj co: dopóki warto zmiennej $i jest mniejsza
lub równa liczbie wszystkich elementów tablicy ($# lista_danych), wykonuj polecenia podane w
p tli. Utwórz tablic zawieraj c elementy $data_projekcji, $godzina, $tytul, $opis, dziel c wska-
zywany przez $i element tablicy $lista_danych wsz dzie tam, gdzie znaleziony zostanie znak |. Na
zako czenie licznik p tli $i zwi kszany jest o 1.
$i=0;$zgodny=0;while($i<=$#lista_danych){($data_projekcji,$godzina,$tytul,
$opis)=split/\|/,$lista_danych[$i]; $i++;
Znak | ma specjalne znaczenie. Je li chcemy, eby w funkcji split/znak_podziału/wyra enie był
on traktowany zwyczajnie, jako znak podziału - musimy przed nim wstawi odwrotny uko nik.
Podobna sytuacja dotyczy innego znaku specjalnego - @. Z tego powodu adres e-mail w kodzie
Perla zapisujemy w postaci: konto\@domena
Sztuczki w HTML-u
Szczególna ostro no wymagana jest równie wtedy, gdy skrypt ma wygenerowa kod HTML-a.
Je li chcemy wypisa znaki cudzysłowu, musimy to zrobi tak, eby nie oznaczały one ko ca ła -
cucha znaków, lecz jego cz
. Polecenie print
"<A HREF="Index.html">\n"; powoduje wy-
wietlenie odno nika. Aby temu zapobiec, musimy przekształci to wyra enie do postaci
print '<A
HREF=\'Index.html\'>\n'; albo print '<A HREF='Index.html'>'. '\n';.
Teraz mo emy sprawdzi , czy w bazie danych wyst puj pozycje o interesuj cej nas dacie. W
tym celu musimy porówna dat wpisan w formularzu z zawarto ci pola data ka dego elementu
naszej bazy. Wykorzystamy do tego konstrukcj if (warunek) {blok programu}, któr poznali my
ju w pierwszej cz ci kursu. Je li oba ła cuchy tekstowe s takie same (eq), licznik zgodnych ele-
mentów zwi kszany jest o jeden i do tabeli na stronie WWW zostaje dopisny wiersz.
If ($data_szukana eq $data_projekcji) { $zgodne++; print"<TR>\n"; print
"<TD>$zgodne</TD>\n"; print "<TD>$godzina</TD>\n"; print "<TD>$tytul</TD>\n";
print "<TD>$opis</TD>\n"; print" </TR>\n";}#To jest koniec konstrukcji #warun-
kowej If}#To jest koniec p tli While
Je li program sprawdził wszystkie rekordy, a licznik zgodnych elementów nadal wynosi 0,
wówczas na monitorze u ytkownika wy wietlany jest komunikat, e w bazie nie ma adnego filmu
spełniaj cego kryteria.
W ostatnim kroku ko czymy budow tabeli i strony HTML oraz zamykamy plik:
if ($zgodne==0) print "<TR>\n"; print "<TD COLSPAN=\"4\"> Nie znaleziono
adnego filmu wy wietlanego dnia $data </TD>\n"; print
"<TR>\n";close(DANE);
Dobrze byłoby, gdyby wła ciciele kin mogli samodzielnie uzupełnia swoje repertuary przez
Internet. Funkcj tak realizuje drugi z zał czonych skryptów. Za po rednictwem formularza da-
ne_wejsciowe.html dane dotycz ce filmów przekazywane s do skryptu dodaj.pl.
Zwró my uwag , e w przypadku problemów z otwarciem pliku skrypt nie wysyła do przegl -
darki informacji o bł dzie, tylko za pomoc polecenia die zapisuje komunikat w pliku error-log
serwera WWW.
Open(DANE, ">>$program")||die "Nie mo na otworzy pliku $program\n";print DATEN
$data_projekcji."|";print DATEN $godzina."|";print DATEN $tytul."|";print DATEN
$opis."\n";close(DANE);
Za pomoc polecenia print dane nie s przekazywane do standardowego wyj cia (czyli przegl -
darki), ale do znacznika pliku DANE i tym samym do skojarzonego z nim pliku program.dat, który
został otwarty za po rednictwem znaków >>.
Ksi ka go ci
Je li u ytkownikom z Internetu chcemy zezwoli na zapisywanie plików, na przykład w ksi ce
go ci, musimy pami ta o blokowaniu dost pu do pliku z danymi. W ten sposób unikniemy sytu-
acji, e kilku u ytkowników zapisuje co w bazie danych w jednej chwili. Mo emy to zrobi w pro-
sty sposób. Pierwszy u ytkownik otwieraj cy zbiór tworzy na serwerze plik o okre lonej nazwie, na
przykład ksiazka.lock. Przed ka dym otwarciem ksi ki go ci konstrukcja if(-e
/ cie ka/ksiazka.lock) {p tla opó niaj ca} sprawdza obecno zbioru blokuj cego (lockfile). Je li
plik ju istnieje, oznacza to, e kto wła nie korzysta z bazy danych. Kolejny u ytkownik b dzie
wi c musiał zaczeka w p tli opó niaj cej. Kiedy pierwszy go wpisze si ju do ksi ki, jego plik
ksiazka.lock jest kasowany. Teraz nast pny u ytkownik po opuszczeniu p tli opó niaj cej b dzie
mógł otworzy zbiór z ksi k go ci, po wcze niejszym zało eniu własnego pliku ksiazka.lock
Podali my tu jedynie ogólny opis metody blokowania pliku, poniewa w rzeczywisto ci wyst -
puje wiele ró nych rozwi za , które w du ym stopniu uzale nione s od systemu operacyjnego.
Przykłady znale mo na w obszernych zbiorach archiwum skryptów w Internecie (patrz: ramka
obok).
Polecenie open pozwala nie tylko otwiera pliki, ale tak e uruchamia programy. Mo liwo ta
jest szczególnie przydatna, je li chcemy wysyła listy za pomoc programu Sendmail.
Zanim jednak zezwolimy na wykonywanie takich operacji, musimy pomy le o ewentualnych
zagro eniach, jakie wi
si z mo liwo ci uruchamiania programów przez u ytkowników z Inter-
netu. Dotyczy to szczególnie takich przypadków, kiedy razem z programem uruchamiana jest po-
włoka (shell).
Tekstowe bazy danych maj swoje naturalne ograniczenia. Znacznie wi cej mo liwo ci oferuj
serwery baz danych. O tym, w jaki sposób uzyska dost p do tego typu baz za pomoc gotowych
modułów Perla, powiemy w nast pnej cz ci naszego kursu.
Automatyczna poczta
Istnieje wiele skryptów, które obsługuj wysyłanie poczty. S one wykorzystywane do dzi kowania
za wpis do ksi ki go ci, potwierdzenia zlece lub zamówie zło onych w sklepie albo przesłania
zawarto ci formularzy zgłoszeniowych. Standardowo w ka dej dystrybucji Linuksa znajduje si
serwer pocztowy - najcz ciej jest nim Send-mail. Niestety, Windows 9x ani NT nie oferuj tego
przydatnego narz dzia. Wła nie wysyłanie poczty było dotychczas głównym ródłem problemów,
jakie wyst powały podczas próby uruchamiania skryptów Perla na komputerach z Windows.
Na szcz cie od pewnego czasu dost pny jest Sendmail w wersji okienkowej. Jego podstawow
zalet jest to, e pracuje z takimi samymi komendami tekstowymi jak jego uniksowy przodek. Pro-
gram ma istotn wad : nie jest bezpłatny. Po upływie 30-dniowego okresu próbnego musimy zapła-
ci około 50 USD za licencj na ka d stacj robocz . Freeware'ow alternatyw dla Sendmaila jest
Blat (patrz: ramka Info). Jednak ta aplikacja ma inny zestaw komend, co sprawia, e konieczna jest
modyfikacja skryptów.
Instalacja Sendmaila pod Windows przebiega bardzo szybko. Wa ne jest, aby w jej trakcie po-
da poprawn cie k dost pu do katalogu /cgi-bin serwera WWW. Standardowo podaje si w tym
przypadku cie k dost pu do folderu skryptów Microsoft Personal Webserver. Po instalacji nale y
uruchomi program konfiguracyjny, który prosi o podanie takich parametrów, jak nazwa serwera
SMTP (np. mail.yourprovider.com), adres e-mail (np. nazwa@yourprovider.com) i adres zwrotny
dla odpowiedzi. Pozostałe dane, takie jak numer portu i czas oczekiwania na poł czenie (timeout),
maj domy lne warto ci i z reguły nie ma potrzeby ich zmieniania. W folderze ze skryptami znajdu-
je si dokumentacja z trzema przykładowymi programami oraz opis komend. Od teraz u ytkownicy
Windows mog korzysta z Sendmaila tak samo jak fani Linuksa.
Aby móc u ywa program pocztowy, najlepiej zdefiniowa zmienn zawieraj c cie k dost -
pu. W rodowisku Linux mo na to zrobi w nast puj cy sposób:
$mail_prog='/usr/sbin/sendmail';
Poniewa okienkowego Sendmaila zainstalowali my w folderze /cgi-bin serwera, to je li uru-
chamiamy skrypty w tym samym folderze, wystarczy napisa :
$mail_prog='sendmail.exe'
Je eli programy znajduj si w ró nych katalogach, podaj c cie k dost pu, musimy przestrze-
ga opisanych wcze niej zasad obowi zuj cych przy u ywaniu znaku \.
Wystarczy tylko jeden wiersz, aby uruchomi program, który wy le maila pod adres okre lony w
zmiennej $mail_adress
$open (MAIL,"|$mail_prog -t");
W tej linii znak | nie słu y do rozdzielania pól bazy danych, ale do sterowania przepływem tek-
stu. Je li | umieszczony jest przed nazw programu, wszystko, co drukowane jest do znacznika pli-
ku MAIL, zostaje przekazane do programu pocztowego. Je eli znak | znajduje si po prawej stronie,
wówczas dane wyj ciowe z programu przekazywane s do znacznika pliku albo do standardowego
wyj cia.
W naszym przykładzie chcemy zapisywa dane do programu. Najpierw do Sendmaila trafi na-
główek. U ywaj c adresów pocztowych w kodzie Perla, pami tajmy o tym, e znak @ musi by
poprzedzony symbolem \. Wa ne jest te , aby nie zapomnie o dwóch pustych wierszach (print
"\n\n") pod nagłówkiem. W przeciwnym razie program nie b dzie wiedział, gdzie ko czy si na-
główek, a gdzie zaczyna tekst. Na zako czenie drukujemy wiadomo i zamykamy plik.
print MAIL "To:$mail_adress\n";print MAIL "Reply-to: na-
zwa\@yourprovider.com\n";print MAIL "From: nazwa\@yourprovider.com\n";print MAIL
"Subject: Kurs Perla\n";print MAIL "\n\n";print MAIL "Szanowny adresa-
cie,\n";print MAIL "\n";print MAIL "To jest demonstracja automatycznego
wysyłania listów.\n";print MAIL "\n";print MAIL "Z pozdrowieniami\n";print MAIL
"\n";print MAIL "\n";print MAIL "Od Sendmail\n";print MAIL "\n";print MAIL
"\n\n";close (MAIL);
Przepis na szybki skrypt
Po co wywa a otwarte drzwi? Poniewa Perl rozpowszechniany jest w formie Open Source, rów-
nie wielu programistów udost pnia bezpłatnie napisane przez siebie skrypty. Taka sytuacja jest
bardzo dobra dla innych u ytkowników, gdy mog je oni wykorzysta . Bardzo cz sto nie jest do
tego wymagana niemal adna wiedza, bo w wielu programach wystarczy skonfigurowa jedynie
kilka wierszy. Mimo wszystko dobrze jest mie przynajmniej ogólne poj cie o działaniu Perla, po-
niewa tylko wtedy skrypty mo na dostosowa do własnych potrzeb - na przykład zmieni format
wynikowej strony HTML.
Skrypty pisane s niemal wył cznie dla rodowiska Unix (Linux), jednak wi kszo z nich dzia-
ła równie pod Windows. Wi kszo , ale nie wszystkie. Najcz ciej dlatego, e autorzy skryptów
odwołuj si cz sto do programów u ywanych w Linuksie, które nie wyst puj w Windows. Po-
cz tkuj cy adepci Perla, którzy chc uruchamia skrypty pod "Okienkami", mog rozpocz od
którego z prostych skryptów opisanych w naszym kursie, na przykład od ksi ki go ci.
Poszukiwania potrzebnego skryptu najlepiej jest rozpocz od archiwum. Jednym z najwi k-
szych i najbardziej popularnych na wiecie jest Matt's Script Archive. Oprócz własnych 20 prac
autor zamie cił tam niemal 3000 najró niejszych skryptów innych programistów. W porównaniu z
innymi zbiorami ten ma bardzo przejrzyst struktur pomimo swojej ogromnej obj to ci. U ytkow-
nicy mog nawet przyznawa oceny skryptom, a wszystkie programy da si posortowa pod wzgl -
dem redniej punktów.
Do autorów, którzy oprócz własnych udost pniaj równie skrypty napisane przez innych, nale-
y te Erlanger Wolfgang Wiese. Na stronie Realm of CGI znajduj si opisy skryptów oraz ich
wersje demonstracyjne.