MENU

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

 
 

Contents copyright © 2000 - 2001, Krzysztof Dziewo±ski. All rights reserved.