background image

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 

 

 

background image

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: 

datagodzinatytul_filmuopis. 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, 

background image

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. 

background image

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.GodzinaTytuł 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. 

background image

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 

background image

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 >>. 

background image

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. 

background image

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 

background image

"\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.