PC Press
O nama
O nama
Pretplata
O nama
Postanite saradnik PC-ja
Kontakt sa redakcijom
PC Press
Novi broj
Novi broj   
Pretrazivanje
Arhiva
Arhiva   
PC Online
PC Plus   
Specijalna izdanja
Programiranje Programiranje
PC #30 : Decembar 1997 Knjiga 50 godina racunarstva u Srbiji

 Naslovna  Sadržaj 
Vladimir Marić  

Jezik za servere

Perl je jezik za razvoj CGI i drugih skriptova. Upoznajmo njegove osnovne karakteristike.

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 to postoje drugi jezici; Perl će vam omogućiti "samo" 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.

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, 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 objektnog 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 (lwallsems.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 oko imena ("trenutno radim na Gloriji"), jezik 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.

Kako je popularnost jezika rasla, u razvoju Perl-a učestvovalo je sve više ljudi. 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

Nekoliko glavnih osobina Perl-a mogu se posmatrati i kao činjenice koje mu idu u korist, ali i kao velike mane. Prvo, 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 se u C-u samo sanja. 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.

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

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, da bi se lakše ocenio dizajn i otklonile koncepcijske greške.|PC_medjunaslov|Pre svega, praktično|medjunaslov_PC|

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. Sintaksna pravila jezika su jednostavna: komande se razdvajaju tačkom i zarezom; tzv. beli razmaci van literala (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. 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.

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 od konteksta u kom se 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 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 primeru, prva print naredba ispisala bi treći elemen niza prosti, broj 5, 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 bejzik 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 zareza, 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

Kako 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, ponaša se kao => kod brojeva i operator . (tačka), koji spaja stringove, npr. $puno_ime=$ime." ".$prezime.

Kontrola toka i kodni blokovi

Umesto minimalnosti i "lepote", kojima teži većina modernih programskih jezika, Perl sadrži sve 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 $m (prolece, leto, jesen, zima) {
    print "U mesecu $m se treba 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 obavezno se izdvajaju u poseban kodni blok, čak i kada se u 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 $broj0;

Ako izvršavanje neke naredbe zavisi od rezultata izvršavanja prethodne, koristitimo Perl-ovu evaluaciju logičkih izraza. 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 zatvorena.";

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

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=handle>;
    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(handle>) {
    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 handle>;

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.

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.