Professional Documents
Culture Documents
Uvod U Programski Jezik Perl
Uvod U Programski Jezik Perl
denja na danom
ra cunalu
programiranje visoke razine relativno lako i brzo pisanje
koda, ali programi su naj ce ce spori, a mogu cnosti su
ograni cene na naredbe koje su nam na raspolaganju
u Perlu je relativno lako programirati, malo je ograni cenja,
izvo
der daje 36
niz koji nije broj pretvara se u vrijednost 0
brojevi se prema potrebi pretvaraju u nizove:
"Z" . 5
*
7 # kao "Z" . 35 daje vrijednost "Z35"
Skriptni jezici k.g. 2009/10 p.19/120
Ugra
dena upozorenja
generiranje upozorenja (warnings) moe se uklju citi pri pozivu Perl
interpretera koritenjem opcije -w
$ perl -w my_program
ili pri svakom pokretanju programa:
#!/usr/bin/perl -w
vie detalja i objanjenja pojedinih upozorenja:
$ man perldiag
Skriptni jezici k.g. 2009/10 p.20/120
Skalarne varijable
imena skalarnih varijabli zapo cinju znakom "$", a slijedi Perl
identikator : niz slova, znamenaka i podvlaka ("_"), pri cemu prvi
znak ne moe biti znamenka
velika i mala slova se razlikuju, a svi su znakovi zna cajni:
$Count i $count su razli cite varijable
$a_very_long_variable_that_ends_in_1 i
$a_very_long_variable_that_ends_in_2 su razli cite
varijable
skalarne varijable u Perlu se uvijek referenciraju predzna cene
znakom "$" !
Skriptni jezici k.g. 2009/10 p.21/120
Skalarno dodjeljivanje vrijednosti
dodjela vrijednosti varijabli, operator "="
$fred = 17;
$barney = hello;
$barney = $fred + 3;
$barney = $barney
*
2
izrazi u kojima se ista varijabla pojavljuje i na lijevoj i na desnoj
strani su vrlo cesti, pa Perl poput jezika C i Java uvodi kra ci zapis
$fred += 5;
$barney
*
= 2;
$str .= " "; # vrijedi i za ulancavanje
$x
**
= 3; # x=x^3
Skriptni jezici k.g. 2009/10 p.22/120
Ispis pomo cu operatora print()
operator print( ) ispisuje skalarnu vrijednost navedenu kao
argument na standardni izlaz
zagrade nije nuno pisati
print "hello world\n";
print 6
*
7;
print (".\n");
moe se navesti i niz argumenata
print "Rezultat je ", 6
*
7, ".\n";
# niz vrijednosti odvojenih zarezima
Skriptni jezici k.g. 2009/10 p.23/120
Interpolacija skalarnih varijabli u nizovima
kada je znakovni niz naveden u dvostrukim navodnicima, podloan
je interpolaciji varijabli
ime varijable navedeno u znakovnom nizu zamjenjuje se
vrijedno cu varijable
$meal = "brontosaurus steak";
$barney = "fred ate a $meal";
$barney = fred ate a . $meal; # isti rezultat
ako skalarnoj varijabli nije dodijeljena vrijednost (odnosno
vrijednost joj nije denirana), ispisuje se prazni niz
ako su uklju cena upozorenja, Perl ce se poaliti
da bi u niz uklju cili znak "$" u doslovnom zna cenju, treba ga
predzna citi silaznom kosom crtom
Skriptni jezici k.g. 2009/10 p.24/120
Interpolacija skalarnih varijabli (2)
primjeri
$fred = hello;
print "Ime je \$fred.\n"; # ispisuje znak dollar
print Ime je $fred . "\n"; # isto
kao ime varijable upotrijebit ce se najdulji mogu ci podniz koji ima
smisla
to moe biti problem
$what = "brontosaurus steak";
$n = 3;
print "fred ate $n $whats.\n"; # varijabla je $whats
print "fred ate $n ${what}s.\n"; # sad je ime $what
print "fred ate $n $what" . "s.\n"; # moze i ovako
Skriptni jezici k.g. 2009/10 p.25/120
Operatori i redoslijed primjene
za uobi cajene operatore koji se koriste i u C-u vrijede i jednaki
redoslijedi primjene
zagrade mijenjaju redoslijed primjene operatora
tablica prednost opada prema dnu tablice
asocijativnost operatori
lijeva zagrade i argumenti operatora listi
lijeva ->
++ --
desna
**
desna \ ! ~ + - (unarni operatori)
lijeva =~ !~
lijeva
*
/ % x
lijeva + - . (binarni operatori)
lijeva << >>
Skriptni jezici k.g. 2009/10 p.26/120
Operatori i redoslijed primjene (2)
nastavak tablice
asocijativnost operatori
< <= > >= lt le gt ge
== != <=> eq ne cmp
lijeva &
lijeva | ^
lijeva &&
lijeva ||
lijeva .. ...
desna ?: (ternarni operator)
desna = += -= .= (i sli cni operatori pridruivanja)
lijeva , =>
desna not
lijeva and
lijeva or xor
Skriptni jezici k.g. 2009/10 p.27/120
Operatori i redoslijed primjene (3)
redoslijed primjene kod operatora iste razine razrjeava se
pravilima asocijativnosti
4
**
3
**
2 # 4
**
(3
**
2) = 4
**
9 (desna asoc.)
72 / 12 / 3 # (72 / 12) / 3 = 6/3 = 2 (l. asoc.)
36 / 6
*
3 # (36/6)
*
3 = 18
u slu caju nedoumice o redoslijedu primjene operatora dobro je
koristiti zagrade
Skriptni jezici k.g. 2009/10 p.28/120
Operatori usporedbe
operatori za usporedbu brojeva: < <= == >= > != vra caju
vrijednost true ili false
za usporedbu znakovnih nizova Perl ima sli cne operatore:
lt le eq ge gt ne
ispituje se jesu li dva znakovna niza jednaka, odnosno koji od
njih je prije u standardnom redoslijedu sortiranja
velika slova se u ASCII kodu nalaza prije malih
usporedba brojevi znakovni nizovi
jednako == eq
razli cito != ne
manje od < lt
ve ce od > gt
manje ili jednako <= le
ve ce ili jednako >= ge
Skriptni jezici k.g. 2009/10 p.29/120
Operatori usporedbe (2)
primjeri
35 != 30 + 5 # false
35 == 35.0 # true
35 eq 35.0 # false (usporedba nizova)
fred lt barney # false
fred lt free # true
fred eq "fred" # true
fred eq Fred # false
gt # true
Skriptni jezici k.g. 2009/10 p.30/120
Ispitivanje uvjeta
naredba if
if ($name gt fred) {
print "$name se sortira nakon fred.\n";
}
if ($name gt fred) {
print "$name se sortira nakon fred .\n";
} else {
print "$name se ne sortira nakon fred.\n";
print "a mozda je to isti niz.\n";
}
za razliku od C-a, viti caste zagrade se zahtijevaju !
Skriptni jezici k.g. 2009/10 p.31/120
Logi cke vrijednosti
pri ispitivanju uvjeta moe se koristiti bilo koja skalarna vrijednost
to je prikladno ako elimo pohraniti vrijednost istinitosti u varijablu
$is_bigger = $name gt fred;
if ($is_bigger) { ... }
Perl nema poseban logi cki tip podatka (boolean), ve c se koristi
nekoliko jednostavnih pravila:
nedenirana vrijednost odgovara logi ckoj vrijednosti false
nula odgovara logi ckoj vrijednosti false, ostali brojevi su true
prazan niz () je false, ostali nizovi su true
iznimka je niz 0 njegova vrijednost istinitosti je false
negacija logi ckog izraza postie se operatorom !
if (! $is_bigger) { ... }
Skriptni jezici k.g. 2009/10 p.32/120
U citavanje podataka
podaci s tipkovnice mogu se u citati operatorom <STDIN>
kada se <STDIN> upotrijebi na mjestu gdje se o cekuje skalarna
vrijednost, Perl u citava cijeli redak teksta sa standardnog ulaza,
sve do prve oznake novog reda
tipi cno, vrijednost <STDIN> zavrava znakom \n
$line = <STDIN>;
if ($line eq "\n") {
print "To je samo prazni redak!\n";
} else {
print "Ucitani redak je: $line";
}
u praksi ne elimo zadrati \n na kraju u citanog znakovnog niza
Skriptni jezici k.g. 2009/10 p.33/120
Funkcija chomp
operator chomp uklanja oznaku kraja reda iz znakovnog niza
$text = "redak teksta\n"; # ili niz ucitan sa <STDIN>
chomp($text); # skida \n
cesto se koristi pri u citavanju teksta
chomp($text = <STDIN>); # ucitavanje teksta bez \n
chomp je funkcija ima povratnu vrijednost, koja predstavlja broj
uklonjenih znakova (nije ba korisno :-)
$redak = <STDIN>;
$broj = chomp $redak # $broj je 1, to smo vec znali
chomp moemo upotrijebiti i bez zagrada
zagrade nisu obavezne osim ako njihovo uklanjanje moe
promijeniti zna cenje izraza !
u starijim Perl programima moemo nai ci na funkciju chop ona
uklanja proizvoljan zavrni znak niza, a ne samo \n
Skriptni jezici k.g. 2009/10 p.34/120
Petlja while
while petlja ponavlja blok naredbi dok god je uvjet ispunjen (true)
$count = 0;
while ($count < 10) {
$count += 1;
print "broj je sada $count\n";
# ispisuje brojeve 1 do 10
}
uvjet se ponaa kao i u naredbi if
viti caste zagrade su obavezne
uvjet se ispituje prije prvog ulaska u petlju, pa petlja moe biti
presko cena ako uvjet od po cetka nije ispunjen
Skriptni jezici k.g. 2009/10 p.35/120
Nedenirana vrijednost
prije nego se varijabli prvi put dodijeli vrijednost, ona ima posebnu
vrijednost undef
ako se takva varijabla upotrijebi na mjestu gdje se o cekuje
znakovni niz, ona se ponaa kao prazni niz
ako se nedenirana varijabla upotrijebi na mjestu broja, njena je
vrijednost 0, to se moe upotrijebiti umjesto inicijalizacije:
# zbrajanje neparnih brojeva
$n = 1;
while ($n < 10) {
$sum += $n;
$n += 2; # sljedeci neparni broj
}
print "Suma je $sum.\n";
sli cno se mogu koristiti i nizovi:
$string .= "more text\n";
Skriptni jezici k.g. 2009/10 p.36/120
Funkcija defined
ako elimo ispitati je li neka varijabla denirana ili ne moemo
primjeniti funkciju defined
npr. <STDIN> moe vratiti vrijednost undef, ako se upis retka
prekine oznakom kraja datoteke (EOF, ctrl-D)
$redak = <STDIN>;
if ( defined($redak) ) {
print "Ucitani redak je: $redak";
} else {
print "Redak nije ucitan!\n";
}
Skriptni jezici k.g. 2009/10 p.37/120
Liste i polja
lista je ure
dena (built-in)
ponekad se ispred imena funkcije navodi znak &
potprogrami koriste odvojeni prostor imena
denicija potprograma zapo cinje klju cnom rje cju sub, slijedi ime
potprograma (bez znaka &), te blok naredbi uokviren viti castim
zagradama
sub marine {
$n += 1; # globalna varijabla $n
print "Hello, sailor number $n!\n";
}
denicija funkcije moe se nalaziti bilo gdje u programu, denicije
su globalne
Skriptni jezici k.g. 2009/10 p.65/120
Pozivanje potprograma
potprogram se moe pozvati u bilo kojem izrazu tako da se navede
ime funkcije uklju cuju ci znak &
&marine; # Hello, sailor number 1!
&marine; # Hello, sailor number 2!
&marine; # Hello, sailor number 3!
&marine; # Hello, sailor number 4!
Skriptni jezici k.g. 2009/10 p.66/120
Povratna vrijednost
svi Perl potprogrami imaju povratnu vrijednost
nema posebne naredbe za vra canje vrijednosti
vra ca se rezultat zadnjeg izraza u potprogramu
primjer
sub sum_of_fred_and_barney {
print "Potprogram je pozvan\n";
$fred + $barney; # rezultat je povratna vrijednost
}
$fred = 3; $barney = 4;
$wilma = &sum_of_fred_and_barney; # $wilma = 7
print "\$wilma je $wilma.\n";
Skriptni jezici k.g. 2009/10 p.67/120
Povratna vrijednost (2)
to ako dodamo jo jednu naredbu u potprogram
sub sum_of_fred_and_barney {
print "Potprogram je pozvan\n";
$fred + $barney;
# rezultat NIJE povratna vrijednost
print "Sada vracam vrijednost\n"; # Oops!
}
zadnji evaluirani izraz vie nije ono to smo namjeravali vratiti, ve c
poziv funkcije print vra ca se njena povratna vrijednost
uklju civanje upozorenja moe pomo ci rezultat izraza nije nigdje
pohranjen (sumnjivo)
Skriptni jezici k.g. 2009/10 p.68/120
Argumenti
umjesto koritenja globalnih varijabli, pri pozivu potprograma
mogu se navesti ulazne vrijednosti argumenti
proslje
du dvije
vrijednosti, pri cemu niz moe biti i silazan
sub list_from_fred_to_barney {
if ($fred < $barney) {
# Count upwards from $fred to $barney
$fred..$barney;
} else {
# Count downwards from $fred to $barney
reverse $barney..$fred;
}
}
$fred = 11;
$barney = 7;
@c = &list_from_fred_to_barney; # (11,10,9,8,7)
Skriptni jezici k.g. 2009/10 p.76/120
U citavanje pomo cu operatora <>
operator <> upoznali smo kod u citavanja sa standardnog ulaza
(<STDIN>)
op cenito se koristi za u citavanje iz datoteke ciji se identikator
navodi unutar zagrada
poseban na cin koritenja je bez navo
denja datoteke
u tom se slu caju podaci u citavaju (redak po redak) iz datoteka
cija su imena navedena kao argumenti naredbenog retka (pri
pozivu programa)
$ ./my_program fred barney betty
ako se ne navede ni jedno ime datoteke, podaci se u citavaju sa
standardnog ulaza
ponaanje po uzoru na standardne Unix alate
argument "-" ozna cava stdin
Skriptni jezici k.g. 2009/10 p.77/120
U citavanje pomo cu operatora <> (2)
primjer
while (defined($redak = <>)) {
chomp($redak);
print "Procitao sam: $redak \n";
}
ako ovaj program pokrenemo bez argumenata, citaju se retci s
tipkovnice
ako se navede vie imena datoteka, citaju se retci iz svake od
njih, redom navo
denje
programa s izlaznim statusom razli citim od 0
if ( ! open LOG, ">>logfile")
{ die "Cannot create logfile: $!"; }
posebna Perl varijabla $! sadri poruku sustava o razlogu
pogreke ("permission denied" ili "file not found") ima
smisla samo ako ispitujemo pogreku koja nastaje pri pozivu OS-a
funkcija die automatski nadodaje ime Perl programa u kojem je
pozvana, te odgovaraju ci broj retka u programu
Cannot create logfile: permission denied at
your_program line 1234.
ako ne elimo ispis imena i retka programa, niz koji se ispisuje
treba zaklju citi s \n
if (@ARGV < 2)
{ die "Not enough arguments\n"; }
Skriptni jezici k.g. 2009/10 p.88/120
Koritenje datoteke
kad je datoteka uspjeno otvorena, koristi se kao i STDIN/STDOUT
u citavanje retka inicira se navo
du poziva funkcija
keys i values asocijativno polje nije mijenjalo
poziv ovih funkcija u skalarnom kontekstu daje broj elemenata
asocijativnog polja
my $count = keys %hash; # broj elemenata = 3
Skriptni jezici k.g. 2009/10 p.97/120
Funkcije nad asocijativnim poljima (2)
funkcija each omogu cava prolazak kroz sve elemente
asocijativnog polja
svakim pozivom funkcija vra ca sljede ci par klju c/vrijednost (kao
listu)
kad se stigne do kraja asocijativnog polja, vra ca se prazna lista
while ( ($key, $value) = each %hash ) {
print "$key => $value\n";
}
lista koju vra ca each %hash pridruuje se paru
($key, $value)
pridruivanje se obavlja u uvjetnom izrazu while petlje
skalarni kontekst, uvjet je ispunjen dok je izvorna lista
neprazna
kad each vrati praznu listu, uvjet poprima vrijednost false,
iako lista ($key, $value) poprima vrijednost
(undef, undef) nije prazna!
Skriptni jezici k.g. 2009/10 p.98/120
Primjer primjene
evidencija o posudbi knjiga u knjinici
$books{"fred"} = 3;
$books{"wilma"} = 1;
ima li osoba posu
denu knjigu ?
if ($books{$osoba}) {
print "$osoba ima bar jednu posudjenu knjigu.\n";
}
ako osoba nema posu
de pojavljivanje
uzorka u znakovnom nizu
$_ = "yabba dabba doo";
if (m/abba/) {
print "It matched!\n";
}
ako se izostavi oznaka operatora, podrazumijeva se podudaranje:
if (/Windows 95/) { print "Time to upgrade?\n" }
Skriptni jezici k.g. 2009/10 p.108/120
Opcije podudaranja
prilikom primjene operatora podudaranja mogu se specicirati
neke opcije
/i : zanemarivanje razlike izme
deni podnizovi
if (@perls = /perl/gi) {
printf "Perl mentioned %d times.\n", scalar @perls;
}
opcije se mogu kombinirati slijednim navo
denjem
ima jo nekoliko mogu cih opcija
Skriptni jezici k.g. 2009/10 p.110/120
Zamjena
operator zamjene (substitution):
s/// : navodi se regularni izraz koji se trai,
te niz znakova kojim se prona
den i zamijenjen)
$_ = "fred flintstone";
if (s/fred/wilma/) {
print "Successfully replaced fred with wilma!\n";
}
globalno pretraivanje i zamjena: opcija /g ako se ne navede,
zamjenjuje se samo jedna pojava traenog uzorka
ako se navede opcija /g, zamjenjuju se sve nepreklapaju ce
pojave uzorka
Skriptni jezici k.g. 2009/10 p.111/120
Transliteracija
operatorom tr/lista_pretrazivanja/lista_zamjene/cds
obavlja se zamjena znakova liste pretraivanja znakovima liste
zamjenskih znakova
operator ima sinonim y/// (sed)
zamjena se obavlja znak po znak
vra ca se broj zamijenjenih (ili obrisanih) znakova
mogu se postaviti opcije :
/c : komplement liste pretraivanja
/d : brisanje prona
denih uzoraka
ako je vie podizraza uokvirenih zagradama, za svaki se oblikuje
varijabla koja pamti prona
dene podnizove
imena ovih varijabli su $1, $2, $3 itd. i odgovaraju redoslijedu
podizraza u zagradama
$_ = "Hello there, neighbor";
if (/(\S+) (\S+), (\S+)/) { # zarez van zagrada
print "words were $1 $2 $3\n";
}
pam cenje varijabli je do sljede ceg uspjenog podudaranja
(resetira sve) trebalo bi provjeriti uspjenost podudaranja (ina ce
citamo rezultate prethodnog)
Skriptni jezici k.g. 2009/10 p.115/120
Povezivanje unazad
povezivanje unazad (backreference) vrlo je blisko varijablama
podudaranja
odnosi se na iste podnizove kao i varijable podudaranja, ali
omogu cuje koritenje u samim izrazima
prona
du kojih se
ume ce zadani niz (glue)
funkcija vra ca spojeni niz
my $x = join ":", 4, 6, 8, 10, 12; # "4:6:8:10:12"
primjeri
my $y = join "abc", "def"; # PAZI! samo "def"
my @lst = split /:/, $x; # @lst = (4, 6, 8, 10, 12)
my $z = join "-", @lst; # $z ="4-6-8-10-12"
Skriptni jezici k.g. 2009/10 p.118/120
Podudaranje u kontekstu liste
kada se operator podudaranja (m//) koristi u kontekstu liste,
povratna vrijednost je lista varijabli podudaranja
$_ = "Hello there, neighbor!";
my($first, $second, $third) = /(\S+) (\S+), (\S+)/;
print "$second is my $third\n";
na ovaj na cin moemo pospremiti rezultat podudaranja za
kasniju primjenu
ako se koristi opcija /g, uzorak se moe na ci na vie mjesta u nizu
svako podudaranje vra ca varijable koje odgovaraju izrazima u
zagradama
my $text = "Fred dropped a 5 ton granite block";
my @words = ($text =~ /([a-z]+)/ig);
print "Result: @words\n";
# Result: Fred dropped a ton granite block
Skriptni jezici k.g. 2009/10 p.119/120
Perl programi u naredbenom retku
Perl se moe koristiti kao alat koji se poziva iz naredbenog retka,
uz navo