Jezik za servere

Vladimir Marić
Prema nekim podacima, najviše CGI skriptova na celom Internetu razvijeno je u Perlu - široj javnosti slabo poznatom programskom jeziku. Popularnost takvih razmera ne dolazi slučajno...


Perl se ne uči u školama, zbog njega ne zasedaju komiteti za standarde, pa on nikada neće izmeniti programiranje kakvo danas poznajemo. Za sve to postoje neki drugi jezici; Perl će vam ponuditi "samo" mogućnost da brzo i efikasno završite posao.


Šta je Perl


Perl je, strogo govoreći, interpretirani jezik opšte namene, (izuzetno) visokog nivoa. Koristi se uglavnom za izdvajanje i obradu podataka iz tekstualnih datoteka, formatiranje i ispis rezultata tih operacija. Kako se dobar deo administriranja Unix računara svodi upravo na takve zadatke, Perl je lako našao svoje mesto pod Suncem. Pravi prodor, međutim, doživeo je tek sa popularizacijom HTML-a i Web-a. Obrada podataka i njihov formatiran ispis je sama suština dinamičkog kreiranja HTML stranica, a za te oblasti Perl spada u vodeće alate.

Kratko, kraće...


U Perl-u je mnogi klasični zadaci rešavaju sa vrlo malo linija koda, a gotovo sve stvari mogu se uraditi na više načina. Uzmimo za primer ispis sadržaja datoteke na ekran. C programer bi u Perl-u napisao ovakav program:

open(handle, "file.ext");
while(!eof(handle)) {
    $line=<>;
    print $line; }

Tako napisan program radi, ali to je u suštini C program sa neznatno promenjenom sintaksom; u duhu Perl-a bi pre bilo napisati nešto ovako:

open(handle, "file.ext");
while(<>) {
    print; }

Ovo rešenje već ozbiljno koristi neke osobenosti Perl-a (npr. default argumente u kontrolnoj strukturi), značajno je kraće i čitljivije. Međutim, može još kraće i bolje!

open(handle, "file.ext") && print <>;

Jedan jedini red ne samo da ispisuje datoteku, već sadrži i prostu kontrolu greške - komanda print će se izvršiti samo ukoliko otvaranje datoteke uspe. Kraće a bolje - to je maksima Perl programiranja.

Jedna od najcenjenijih osobina Perl-a je jednostavnost. Klasični Hello world program glasi: print "Hello world!" - nema suvišnih deklaracija i poštovanja pravila, sve je podređeno efikasnosti.
Osnovne karakteristike Perl-a kao programskog jezika su: sintaksa po uzoru na C, veoma slaba tipizacija promenljivih, razvijene mogućnosti procesiranja teksta (regularni izrazi), moćna podrška za rad sa listama i asocijativnim nizovima, jednostavan pristup datotekama, bazama podataka i TCP/IP socket-ima, mogućnost modularnog i/ili objektno orijentisanog programiranja i POSIX kompatibilnost.


Istorija


Perl je relativno mlad jezik, nastao iz potrebe da se konkretni zadaci realizuju na što jednostavniji i što lakši način. Njegov tvorac, Larry Wall (lwall@sems.com), po profesiji Unix sistem programer, je 1986. godine za potrebe projekta na kojem je tada radio razvio skript jezik koji kombinuje mogućnosti klasičnih Unix alata u kompaktnu celinu. U početku se jezik zvao Gloria, po autorovoj supruzi, ali je zbog izvesne zabune koji je ovo ime izazivalo ("trenutno radim na Gloriji"), jezik je preimenovan u Pearl; vremenom je suvišno slovo nestalo, a jezik je dobio svoj konačni naziv - Perl. Kada se ime ustalilo, lako je smišljen i naziv čija je Perl tobožnja skraćenica - Practical Extraction and Report Language.
Bez ambicija da proširi vidike i postavi nove standarde u programiranju, Perl je građen prema sledećim uzorima: grep/awk, baterija programa za pretraživanje i selekciju podataka iz datoteka, sh komandni jezik (Unix shell), sed (streaming editor za obradu teksta) i C, kao osnovni programski jezik u tom okruženju.
Kako je popularnost jezika rasla, u razvoju Perl-a učestvovalo je sve više ljudi, i a mogućnosti su postajale sve veće. U danas aktuelnoj verziji 5 Perl donosi module i mogućnost objektno orijentisanog programiranja, ali i dalje ostaje jednostavan i kompaktan skript jezik. Umesto dodavanja novih ključnih reči i operatora, čime bi jezik postao glomazniji i teži za učenje, osnova jezika postajala je sve rafinisanija, tako da je u verziji 5 broj ključnih reči smanjen (!) u odnosu na verziju 4 za oko 30%.


Za i protiv


Paradoksalno, nekoliko glavnih osobina Perl-a mogu se posmatrati i kao činjenice koje mu idu u korist, ali i kao velike mane. Pre svega, jezik je interpretiran, što ga čini unekoliko jednostavnijim za razvoj. "Opuštena" tipizacija promenljivih, ako o nekoj tipizaciji uopšte može biti reči, dozvoljava ekspresna rešenja o kojima C programeri mogu samo da sanjaju. Sa druge strane, slaba tipizacija je nepresušan izvor grešaka, a ako vam distribuiranje programa u vidu izvornog koda nije prihvatljivo, nalazite se pred (skoro) nerešivim problemom.

Kako nabaviti Perl


Unix računar bez instaliranog Perl-a je prava retkost; ako imate nalog na nekom, gotovo je sigurno da imate pristup Perl-u, pa odmah možete da krenete u eksperimentisanje.
Pravo mesto za pronalaženje Perl interpretera, raznih dodataka i svega ostalog vezanog za ovaj jezik je Central Perl Archive Network (CPAN). Glavni server CPAN-a je ftp://ftp.funet.fi/pub/languages/perl/CPAN/, a postoje i brojni mirror serveri širom sveta. Perl postoji u verzijama za sve platforme koje nešto znače u računarskom svetu; glavni mrežni i PC operativni sistemi se podrazumevaju.

Povoljna cena (Perl je besplatan) i raspoloživost na svim relevantnim platformama su takođe privlačni, ali nedostatak zvanične podrške i, još gore, zvaničnog standarda mogu biti veoma zabrinjavajući. Perl je u verziji 5 doživeo ozbiljne promene i proširenja, ali ne postoje garancije da će se sve ekstenzije pokazati uspešnim i ući u naredne verzije.
Još jedna posledica interpretirane prirode Perl-a je manja brzina izvršavanja u odnosu na kompajlirane jezike. Međutim, kako hardver postaje moćniji, razlika u brzini je sve manje značajna - da li će program završiti obradu za deseti ili stoti deo sekunde malo je važno. Naravno, ova logika se ne može primeniti na masivne proračune i vremenski kritične operacije, ali takvi zadaci se i ne rešavaju u Perl-u.
Perl je omiljena alatka za razvoj administratorskih skriptova na Unix-u, obradu e-mail-a (jedan od najpopularnijih programa za održavanje mailing lista, Majordomo, napisan je u Perl-u) i, posebno, brzo pisanje CGI skriptova. Zbog svoje jednostavnosti, pogodan je i za pravljenje prototipa nekog kompleksnog programa, kako bi se što lakše ocenio dizajn i otklonile koncepcijske greške pre nego što se pređe na "detaljno" kodiranje u ciljnom jeziku.


Pre svega, praktično


Perl program je običan tekst fajl, koji sadrži niz naredbi. Nenaviknutom oku niz Perl naredbi izgleda kao čudna mešavina C-a, Unix shell skripta, i engleskog jezika (što, u stvari, i jeste). Osnovna sintaksna pravila jezika su jednostavna: komande se razdvajaju tačkom i zarezom; tzv. beli razmaci van literala (ključne reči, nazivi funkcija, promenljivih i ostalih objekata, stringovi) se ignorišu, što znači da program može imati proizvoljnu vizuelnu strukturu; tekst iza znaka # se smatra za komentar i zanemaruje se.
Postoji nekoliko načina za izvršavanje Perl programa. Pre svega, možemo direktno pozvati interpreter navodeći ime programa, dakle perl hello.pl. Na Unix računarima u prvom redu datoteke može da se zada ime interpretera koji izvršava skript, pa se kasnije prostim startovanjem datoteke interpreter automatski poziva i pokreće program (ne zaboravite da dozvolite izvršavanje datoteke, komandom chmod +x hello.pl). Linija koju treba dodati na početak programa glasi

#!/usr/bin/perl

Na drugim sistemima, ovaj red biće protumačen kao komentar i neće smetati. Treći način pokretanja je zadavanje celog programa u komandnoj liniji interpretera (iznenadićete se šta sve jedna linija Perl programa može da uradi):


Promenljive


U Perl-u postoje dva osnovna tipa promenljivih - skalari i nizovi. Skalarna promenljiva može da sadrži integer, broj u pokretnom zarezu ili string. Na koji način će promenljiva biti protumačena zavisi samo od konteksta u kom nalazi prilikom evaluacije izraza - promenljiva koja, na primer, sadrži vrednost 100 može u jednoj naredbi učestvovati u aritmetičkim operacijama kao ceo broj, a već u sledećoj biti kao upoređivana sa drugim stringom.
Nazivi skalarnih promenljivih uvek počinju znakom $, recimo $mesec=5; ili $mesec="Maj";. String promenljive počinju znakom @, na primer:

@prosti=(2, "tri", 5, "sedam");
print "$prosti[2]\n";
print "@prosti\n";

Mešanje stringova i brojeva u nizu ne predstavlja problem: sa stanovišta Perl-a, to su sve skalari. Primetite da pri referenciranju pojedinih članova niza ime promenljive počinje znakom $, a kada se pristupa celom nizu kao jednoj promenljivoj koristi se prefiks @. U prethodnom primeru, prva print naredba ispisala bi treći elemen niza prosti, broj 5 (indeksi u nizovima počinju od 0, kao u C-u), dok bi drugi print ispisao sve članove niza.
Ukoliko se evaluira u skalarnom kontekstu, promenljiva nizovnog tipa sadrži dužinu samog niza. Na primer:

$duzina=@prosti;
print $duzina;

ispisaće broj 4, jer toliko članova ima niz @prosti. Ukratko, operacije nad nizovima koje Perl dozvoljava zaprepastiće ne samo C i paskal, već i bejzin programere. Recimo, ($dva, $tri)=@prosti; je validna dodela - u promenljivoj $dva naći će se broj 2, u promenljivoj $tri reč "tri". Nadovezivanje nizova je takođe jednostavno:

@prolece=("mart", "april", "maj");
@leto=("jun", 7, "avgust");
@pola_godine=(@prolece, @leto);

Posebna vrsta nizova, jedan od razloga uspeha koji je Perl postigao, jesu asocijativni nizovi. Kod običnih nizova, indeks - vrednost koja određuje položaj elementa u nizu - je ceo broj, koji ide od nule do poslednjeg člana niza. Kod asocijativnih nizova, indeks je bilo kakav skalar - string ili broj, svejedno. U suštini, asocijativni nizovi su liste parova (ime, vrednost), a elementi niza se referenciraju po imenu umesto po broju. Promenljive ovog tipa imaju prefiks %, a operator indeksiranja je {} (umesto [] kod običnih nizova):

%ext=('txt' =>> 'Tekst datoteka',
      'exe' =>> 'Izvršni program',
      'zip' =>> 'ZIP arhiva');
$ext{'doc'}="MS Word dokument";
print $ext{'zip'};

Separator =>>, koji verovatno prvi upada u oči, je sinonim zarez, koji se koristi da bi se povećala preglednost i napravila (za programera) razlika između separatora ime-vrednost i par-par. Naredba print na kraju programa ispisaće vrednost elementa sa indeksom 'zip', a to je "Zip arhiva".


Operatori


Budući da je nastao po ugledu (i) na C, Perl poseduje celokupnu bateriju aritmetičkih i logičkih operatora iz ovog jezika. Naredbe dodele ($a=$b, $a+=$b itd) su takođe prenete iz C-a; tu je čak i trinarni operator ?. Dodatni aritmetički operator je stepenovanje ($stepen = $a**$b), a novi logički operator je poređenje: $c = $a<<=>>$b vraća 1 ako je $a>>$b, 0 ako je $a==$b odnosno -1 ako je $a<<$b.
Uvedena je i cela grupa logičkih operatora za poređenje stringova (eq testira jednakost stringova, ne nejednakost, gt da li je prvi string veći itd). Poseban kuriozitet je operator x: print "=" x 40; će štampati liniju od četrdeset znakova =. Tu su još operator poređenja stringova cmp, koji se ponaša kao <<=>> kod brojeva i operator . (tačka), koji spaja stringove, npr. $puno_ime=$ime." ".$prezime.


Kontrola toka i kodni blokovi


Osnovna upotreba logičkih operatora u skript jeziku je ispitivanje nekih uslova radi grananja u programu. Umesto minimalnosti i "lepote", kojima teži većina modernih programskih jezika, Perl sadrži (autoru ovog teksta se čini) sve čoveku poznate kontrolne strukture - pored klasičnog if - else ispitivanja uslova, i for, while i do-while petlji, tu su još unless ispitivanje uslova (suprotno od if), zatim until i do-until petlje, i još mnogo toga... sve što će vam ikad zatrebati. Neke od kontrolnih struktura vode poreklo iz Unix shell skripta, kao konstrukcija foreach:

foreach $mesec (@prolece, @leto, @jesen, @zima) {
    print "U mesecu $mesec se treba što više odmarati!\n" }

Pod uslovom da imamo korektno definisane nizove @prolece, @leto, @jesen i @zima sa nazivima meseca u godini, navedeni program će ispisati ovu veoma istinitu rečenicu za svaki mesec, tj. za svaki član niza koji je predat kao argument foreach petlji.
Delovi programa koji se uslovno izvršavaju (u nekoj od petlji, iza if ili unless uslova) obavezno se izdvajaju u poseban kodni blok, čak i kada se njemu nalazi samo jedna naredba. Kodni blokovi, kao u C-u, počinju znakom {, a završavaju se sa }. Na primer:

$len=@prosti;
for($i=0; $i<<$len; $i++) {
    print "$prosti[$i], "; }

će ispisati članove niza prosti, odvojene zarezima. If i unless konstrukcije imaju i alternativnu sintaksu - ako se (u zavisnosti od uslova) izvršava samo jedna naredba, ispitivanje se navodi iza same naredbe:

print "Broj je negativan!" if $broj<<0;

Ako izvršavanje neke naredbe zavisi od rezultata izvršavanja prethodne, zgodno je koristiti način na koji Perl vrši evaluaciju logičkih izraza. Naime, kod logičkog ili (operator ||) drugi operand se evaluira samo ako prvi nije tačan (da je prvi tačan, izraz bi bio tačan bez obzira na vrednost drugog operanda). Kod logičkog i (&&) važi analogno pravilo - drugi operand se evaluira samo ako je prvi tačan. Tako je moguće pisati sledeće "skraćene" naredbe:

open(handle, "file.ext") || print "Greška u otvaranju datoteke!";
close(handle) && print "Datoteka uspešno zatvorena.";

I prvoj naredbi, poruka o grešci biće ispisana samo ako funkcija open vrati netačnu vrednost, tj. ako otvaranje datoteke ne uspe; u drugoj naredbi, do ispisa će doći jedino ako se prva funkcija, zatvarnje datoteke, uspešno izvrši.


U sledećem broju...


U sledećem nastavku priče o Perl-u posvetićemo pažnju operacijama sa nizovima, važnom aspektu ovog programskog jezika. Perl obiluje promenljivama specijalne namene, na koje ćemo se takođe osvrnuti. Rad sa datotekama je takođe nezaobilazna tema... a Perl je jezik koji vredi naučiti.






PC home - osnovna strana Novi broj|Arhiva|Pretrazivanje svih brojeva|O nama
Pretplatite se na PC|Postanite saradnik casopisa PC|Pitanja i komentari u vezi casopisa