Najprostsze skrypty
W rozdziale "MiΩdzy serwerem a
skryptem" om≤wiony zosta│ przyk│ad najprostszego skryptu CGI, kt≤rego wynik
wykonania przedstawiony jest na rys.2. Skrypt ten
zapisany w jΩzyku Perl mo┐e mieµ np. tak▒ postaµ (wszystkie omawiane w tym
poradniku skrypty znale╝µ mo┐na pod adresem http://www.wsp.krakow.pl/papers/abc_cgi/):
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html>\n<head><title>Skrypt</title></head>\n";
print "<body>\n<h1>Jestem skryptem</h1>\n";
print "</body>\n</html>\n";
Skrypt sk│ada siΩ zatem po prostu z ci▒gu instrukcji print,
wypisuj▒cych na standardowe wyj╢cie nag│≤wek Content-type: text/html, a
nastΩpnie kod HTML strony. Kombinacja znak≤w "\n" w perlowej instrukcji
print oznacza przej╢cie do nowego wiersza - instrukcja ta nigdy nie
przechodzi do nowego wiersza "sama z siebie", a wiΩc ka┐de miejsce, gdzie
powinno nast▒piµ takie przej╢cie, trzeba jawnie zaznaczyµ. Zauwa┐my, ┐e dziΩki
umieszczeniu podw≤jnej sekwencji "\n\n" na ko±cu pierwszej instrukcji uzyskujemy
pusty wiersz niezbΩdny do oddzielenia nag│≤wka od tre╢ci strony.
Ten sam efekt mo┐na uzyskaµ nieco pro╢ciej, u┐ywaj▒c innej postaci instrukcji
print:
#!/usr/bin/perl
print <<"KONIEC";
Content-type: text/html
<html>
<head><title>Skrypt</title></head>
<body>
<h1>Jestem skryptem</h1>
</body>
</html>
KONIEC
Ta forma instrukcji przepisuje na standardowe wyj╢cie wszystkie
nastΩpuj▒ce po niej wiersze skryptu, a┐ do napotkania wiersza rozpoczynaj▒cego
siΩ od tekstu podanego po znakach "<<", czyli s│owa "KONIEC".
Rzecz jasna skrypt taki nie ma wiΩkszego sensu, gdy┐ wypisywana przeze± tre╢µ
jest niezmienna - jego rolΩ m≤g│by zatem r≤wnie dobrze spe│niaµ umieszczony na
serwerze zwyk│y plik HTML. Z regu│y skrypty CGI wykorzystuje siΩ do generowania
stron, kt≤rych tre╢µ zmienia siΩ przy ka┐dym uruchomieniu skryptu, tak jak w
poni┐szym przyk│adzie, podaj▒cym aktualny czas systemowy na serwerze:
#!/usr/bin/perl
@miesiace = ("stycznia", "lutego", "marca", "kwietnia",
"maja", "czerwca", "lipca", "sierpnia",
"wrze╢nia",
"pa╝dziernika", "listopada", "grudnia");
@dni_tyg = ("niedziela", "poniedzia│ek", "wtorek", "╢roda",
"czwartek", "pi▒tek", "sobota");
print "Content-type: text/html; charset=iso-8859-2\n\n";
print "<html>\n<head><title>Zegar</title></head>\n";
print "<body>\n<h1>Aktualny czas</h1>\n";
($sek,$min,$godz,$dzien,$mies,$rok,$dztyg) = localtime;
print "Jest $dni_tyg[$dztyg], $dzien $miesiace[$mies] ";
print 1900+$rok,", godzina $godz:$min:$sek.\n";
print "</body>\n</html>\n";
Na pocz▒tku skryptu tworzymy dwie tablice o nazwach miesiace i
dni_tyg, zawieraj▒ce odpowiednio polskie nazwy miesiΩcy (w dope│niaczu,
jako ┐e tej formy gramatycznej u┐ywa siΩ w zapisie daty) oraz dni tygodnia. Po
wypisaniu nag│≤wka HTTP (zauwa┐my w nag│≤wku fragment "charset=iso-8859-2",
informuj▒cy o zastosowanym kodowaniu polskich liter) oraz pocz▒tku kodu strony
korzystamy z wbudowanej funkcji Perla localtime, aby pobraµ aktualn▒
warto╢µ zegara systemowego. Poniewa┐ funkcja ta zwraca listΩ liczb, zawieraj▒c▒
kolejno sekundy, minuty, godziny itd., po lewej stronie instrukcji podstawienia
u┐ywamy dora╝nie stworzonej takiej listy, sk│adaj▒cej siΩ z siedmiu zmiennych.
Uzyskane warto╢ci wykorzystujemy nastΩpnie w instrukcji print. W Perlu
mo┐na umieszczaµ warto╢ci zmiennych wewn▒trz sta│ych tekstowych ujΩtych w
cudzys│owy, co u│atwia zapis instrukcji w por≤wnaniu z innymi jΩzykami
programowania (takimi jak C), w kt≤rych zmienne zawsze musimy oddzielaµ od
sta│ych np. przecinkami. Korzystaj▒c z wcze╢niej zdefiniowanych tablic
dni_tyg i miesiace zamieniamy liczbowe warto╢ci miesi▒ca i dnia
tygodnia zwr≤cone przez funkcjΩ localtime na ich zapis s│owny. Do
warto╢ci roku musimy natomiast dodaµ 1900, poniewa┐ funkcja localtime
traktuje rok 1900 jako "zerowy" i podaje liczbΩ lat wzglΩdem niego - czyli np.
rok 2000 reprezentowany jest w postaci liczby 100. Wyra┐e± nie mo┐na jednak
umieszczaµ wewn▒trz sta│ych tekstowych, st▒d te┐ zapis 1900+$rokmusimy
oddzieliµ od pozosta│ej czΩ╢ci tekstu, aby Perl wyliczy│ jego warto╢µ (gdyby╢my
umie╢cili go wewn▒trz cudzys│ow≤w, skrypt zamiast "2000" wypisa│by nam
"1900+100"). Zwr≤µmy przy okazji uwagΩ, ┐e poniewa┐ w pierwszej instrukcji
print nie ma sekwencji znak≤w "\n", tekst wypisywany przez obydwie
instrukcje znajduje siΩ w jednym wierszu. Otrzymany wynik przedstawiony jest na
rys.4.
W ten spos≤b uzyskali╢my skrypt, podaj▒cy aktualny czas systemowy serwera;
│atwo mo┐emy sprawdziµ - naciskaj▒c kilkakrotnie przycisk "Reload" w
przegl▒darce - ┐e przy ka┐dorazowym za│adowaniu strony podawany bΩdzie inny
czas. Zwr≤µmy uwagΩ na r≤┐nicΩ miΩdzy tym rozwi▒zaniem, a stosowanym czΩsto na
stronach WWW podawaniem aktualnego czasu z wykorzystaniem Javascriptu; to drugie
rozwi▒zanie podaje nam aktualny czas klienta, czyli komputera, z kt≤rego
ogl▒damy stronΩ, a nie serwera - r≤┐nica mo┐e byµ do╢µ istotna, je┐eli np.
serwer znajduje siΩ w innej strefie czasowej.
Zamiast rΩcznie naciskaµ przycisk "Reload", mo┐emy spowodowaµ, aby zawarto╢µ
strony samoczynnie od╢wie┐a│a siΩ co pewien czas - np. co 10 sekund.
Wykorzystamy w tym celu pole Refresh nag│≤wka HTTP (por. tabela 1). Choµ nie
znajduje siΩ ono w oficjalnym standardzie protoko│u HTTP, rozpoznawane jest
przez wiΩkszo╢µ przegl▒darek. Zamie±my zatem pierwsz▒ instrukcjΩ print w
powy┐szym skrypcie na
print "Content-type: text/html; charset=iso-8859-2\n";
print "Refresh: 10; url=http://www.serwer.com/katalog /data.cgi\n\n";
Adres podany po znaku r≤wno╢ci w drugim wierszu powinien byµ adresem, do
kt≤rego przegl▒darka ma przej╢µ po up│ywie 10 sekund - w naszym przypadku jest
to ponownie ten sam adres, pod kt≤rym znajduje siΩ nasz skrypt. (R≤wnowa┐nym
sposobem - w istocie rozpoznawanym nawet przez wiΩksz▒ liczbΩ przegl▒darek -
by│oby umieszczenie odpowiedniego znacznika META w kodzie HTML wypisywanej
strony; odpowiedni przyk│ad znajduje siΩ na
wspomnianej wcze╢niej stronie WWW ze skryptami).
Zamiast jawnie wpisywaµ do skryptu jego adres - co niesie ze sob▒ takie
niebezpiecze±stwo, ┐e zmieniaj▒c nazwΩ skryptu lub jego lokalizacjΩ zapomnimy go
odpowiednio zmodyfikowaµ - mo┐emy adres ten skonstruowaµ w skrypcie
automatycznie, korzystaj▒c ze zmiennych ╢rodowiskowych (por. tabela 2).
Wszystkie zmienne ╢rodowiskowe s▒ dostΩpne w Perlu jako elementy tablicy
asocjacyjnej o nazwie ENV (Perl rozr≤┐nia du┐e i ma│e litery w nazwach
zmiennych) i mo┐na odwo│aµ siΩ do nich poprzez zapis postaci $ENV{'NAZWA'},
gdzie NAZWA jest nazw▒ zmiennej ╢rodowiskowej (tu r≤wnie┐ rozr≤┐niane s▒ du┐e i
ma│e litery).
Jak wynika z tabeli 2, adres serwera dostΩpny jest w zmiennej SERVER_NAME,
za╢ ╢cie┐ka dostΩpu do skryptu - w zmiennej SCRIPT_NAME. Z│o┐enie warto╢ci tych
dwu zmiennych razem i dopisanie na pocz▒tku "http://" da nam zatem szukany
adres. Druga z przedstawionych powy┐ej instrukcji przybierze wobec tego postaµ
print "Refresh: 10; url=http://$ENV{'SERVER_NAME'} $ENV{'SCRIPT_NAME'}\n\n";
Tak zmodyfikowany skrypt, niezale┐nie od tego, jak▒ nadamy mu nazwΩ i pod
jakim adresem umie╢cimy, zawsze bΩdzie poprawnie podawa│ w polu Refresh
swoj▒ w│asn▒ lokalizacjΩ.
Autor:
Jaros│aw Rafa
raj@inf.wsp.krakow.pl
Artyku│ pochodzi ze strony :
http://wsp.krakow.pl/papers
|