Section author: Luka Vretenar
Skriptiranje u Perl-u¶
Interpretirani skriptni programski jezik osnovne namjene za obradu teksta.
perl
interpreter je besplatan i slobodno dostupan sa adrese perl.org.perl
interpreter dolazi preinstaliran na gotovo svimunix
sustavima, uključujući ilinux
.Više informacija o
perl
jeziku i o njegovoj povjesti na Wikipediji.Danas većinom na putu u zaborav, nekada je pogonio većinu skripti za generiranje sadržaja dostupnog na internetu (
cgi scripts
).Na modernim sustavima u potpunosti zamjenjen dinamičkim interpretiranim jezicima kao što su
python
iruby
.
Pokretanje perl aplikacija¶
Skripte za izvršavanje
perl
koda pišemo u običnim tekstualnim datotekama.Za pisanje skripti možemo koristiti klasične tekstualne editore ili neki
IDE
(Integrated developement environment
).Programske skripte moraju započeti sa posebnom linijom koja definira da želimo skriptu izvršiti kao
perl
program:#!/usr/bin/perl
Perl
skriptu možemo pokrenuti na dva načina, ako pretpostavimo da se naša skripta nazivaskripta.pl
:pokretanje direktnim pozivanjem
perl
interpretera:perl skripta.pl
dodjeljivanjem prava za pokretanje skripti te pokretanje skripte kao zasebnu aplikaciju na
Linux
-u:# prvo datoteci dodijelimo prava pokretanja chmod u+x skripta.pl # pokrenemo skriptu ./skripta.pl
Hint
Znak #
na početku linije nam ujedno označava i komentar u kodu. Linije koje započinju tim znakom će biti ignorirane od strane perl
interpretera pri izvršavanju skripte.
Zadatak
Napravite novu skriptu naziva
prva.pl
i u nju zapišite:#!/usr/bin/perl print("Hello world!\n");
Postavite skripti prava pokretanja i pokrenite ju u komandnoj liniji.
Osnove sintakse¶
Svaka linija koda u
perl
skripti, koja nije komentar ili početak logičkog grananja, mora završavati znakom;
!
Varijable i vrijednosti¶
Varijable su simboli kojima imenujemo određene vrijednosti u memoriji računala.
U
perl
-u sve varijable počinju znakom$
nakon čega slijedi ime varijable.Pri odabiru imena pojedine varijable potrebno je paziti da se zadovolje slijedeći uvjeti:
naziv varijable mora započeti znakom
$
nakon znaka za varijablu slijedi najmanje jedno slovo iz abecede
može slijediti kombinacija bilo kojeg broja slova, znamenki brojeva i znakova
_
.
Primjer ispravnih naziva varijabli:
$x $var $my_variable $var2
Primjer neispravnih naziva varijabli:
$47x $_var $variable! $new.var
Nazivi varijabli su osjetljivi na velika i mala slova,
$Var
nije isto što i$var
.Vrijednosti varijablama pridružujemo korištenjem znaka
=
, primjeri:$var = 42; $ime = "Lucija"; $a = $b;
Prije korištenja određene varijable u skripti, potrebno ju je definirati tako da joj pridružimo neku početnu vrijednost.
Nije potrebno specificirati vrste podataka u varijablama pri definiciji,
perl
interpreter sam prepoznaje vrstu podataka.Vrijednosti koje dodijeljujemo varijabljama u
perl
skriptama su najčešće:nizovi znakova, ograđeni navodnicima –
"Hello world!"
brojčane vrijednosti –
42
,3.14
Operacije sa varijablama¶
Nad vrijednostima varijabli možemo izvoditi numeričke i logičke operacije.
Numeričke operacije su primjenjive na varijablama koje sadrže brojeve i vraćaju nam novu numeričku vrijednost:
+
– zbrajanje-
– oduzimanje*
– množenje/
– dijeljenje
Logičke operacije primjenjujemo kada želimo usporediti vrijednosti dvaju varijabli i vraćaju nam logičke izraze točno ili netočno:
==
– logička usporedba jednakosti!=
– provjera nejednakosti<
,>
– manje od, veće od<=
,>=
– manje ili jednako od, veće ili jednako od&&
,||
– logičko I, logičko ILI
Logičku vrijednost točno nam predstavlja broj
1
a netočno broj0
.Ako želimo koristiti vrijednost pojedine varijable u izrazu, zapišemo njezino puno ime:
$c = $a + $b; $tekst = "Pozdrav $ime $prezime !";
Na isti način možemo koristiti vrijednosti varijabli u nizovima znakova: zapisom punog imena varijable gdje želimo njezinu vrijednost.
Čitanje i pisanje u komandnu liniju¶
Čitanje linija teksta iz komandne linije u naš
perl
program se izvodi preko specijalne varijable<STDIN>
.Mjesto u skripti na kojem se nalazi simbol
<STDIN>
će biti tijekom izvršavanja skripte zamijenjeno jednom pročitanom linijom sa ulaza programa.Ispis vrijednosti jedne ili više varijabli nazad u komandnu liniju vršimo naredbom
print()
kojoj u zagradama dajemo vrijednost za ispis.Ulaz i izlaz u program su nam najčešće komandna linija u kojoj smo pokrenuli program.
Primjer čitanja jedne linije i njen ispis u komandnu liniju:
$linija = <STDIN>; print($linija);
Kada čitamo neki broj ili niz znakova iz jednog reda potrebno je prvo pročitanu liniju pročistiti od znaka za kraj linije sa
chomp()
naredbom:$broj = <STDIN>; chomp($broj); $dvostruko = $broj * 2; print("dvostruka vrijednost unesenog broja je ", $dvostruko);
Primjer
Program za pretvaranje metara u kilometre i obrnuto:
#!/usr/bin/perl print("Unesite vrijednost udaljenosti za pretvoriti: "); $udaljenost = <STDIN>; chomp($udaljenost); $metri = $udaljenost * 1000; $kilometri = $udaljenost / 1000; print("$udaljenost kilometara = $metri metara\n"); print("$udaljenost metara = $kilometri kilometara\n");
Zadatak
Napiši skriptu koja učitava dva broja, zbroji ih i ispiše rezultat.
Logička grananja¶
Grananja if
, if-else
¶
Logička grananja koristimo da bi izvršili određeni dio koda samo kada vrijedi određeni logički izraz.
Grananja se sastoje od jednog ili više logičkih izraza i od jednog ili više blokova koda koji izvršavamo.
Blokovi koda u grananja su grupirani između znakova
{
i}
.Najjednostavnije logičko grananje nam je
if
:if (uvjet) { naredbe; }
Grananje možemo proširiti i na slučaj da se ne ispuni uvjet na
else
i na provjeru više uvjeta:if (uvjet) { naredbe; } else { naredbe; } if (uvjet1) { naredbe; } elsif (uvjet2) { naredbe; } else { naredbe; }
Provjere
elsif
možemo ponavljati više puta u istom logičkom grananju.Uvjet se sastoji od logičkog izraza koji može imati jednu ili dvije varijable i neki od logičkih operacija između njih.
Najčešće provjeravamu jednakost vrijednosti dvije varijable logičkim izrazom za jednakost
==
.
Primjer
Primjer provjere jednakosti unesenih brojeva.
#!/usr/bin/perl print("Unesite broj: "); $broj1 = <STDIN>; chomp($broj1); print("Unesite drugi broj: "); $broj2 = <STDIN>; chomp($broj2); if ($broj1 == $broj2) { print("Uneseni brojevi su jednaki.\n"); } else { print("Uneseni brojevi nisu jednaki.\n"); }
Petlje while
, until
¶
U slučaju da određene naredbe želimo ponavljati sve dok je određeni uvijet zadovoljen koristimo petlje
while
iuntil
.Petlja
while
se sastoji od uvijeta i bloka naredbi koje ponavljamo. Sve dok je uvijet zadovoljen ponavlja se izvršavanje tih naredbi:while (uvjet) { naredbe; }
Petlja
until
se razlikuje od petljewhile
po tome što je logika uvjeta obrnuta, izvršavanje naredbi se ponavlja sve dok nije zadovoljen zadani uvjet:until (uvjet) { naredbe; }
Primjer
Odbrojavanje do nule:
#!/usr/bin/perl $brojac = 10; while ($brojac >= 0) { print($brojac, "\n"); $brojac = $brojac - 1; }
Čitanje ulaza dok nije pročitan ispravan broj:
#!/usr/bin/perl print("Koliko iznosi 17 plus 26? "); $broj = <STDIN>; chomp($broj); while ($broj != 43) { print("Krivo! Pokušaj ponovo: "); $broj = <STDIN>; chomp($broj); } print("Točno!\n");
Zadatak
Napiši program koji koristi
until
petlju za ispis prvih 10 brojeva silazno (10-1).
Zadatak
Napiši program koji koristi
while
petlju za ispis prvih 10 brojeva uzlazno (1-10).
Regularni izrazi¶
Najvažnija funkcionalnost jezika
perl
.Regularni izrazi se zadaju kao vrijednosti ograđene sa dvije kose crte
/
i/
:/[0-9]+/ /xy+/ /$var/
Primjena zadanog regularnog izraza nad nekom varijablom koja sadrži niz znakova se vrši specijalnim operaterom
=~
:$tekst =~ s/123/abc/; $uvjet = $ime =~ /luka/i;
Unutar ograda regularnog izraza
/
i/
mogu se nalaziti i nazivi varijabla čije vrijednosti želimo koristiti u regularnom izrazu.
Pažnja!
Operater
=~
se može promijeniti vrijednost varijable nad kojom se primjenjuje. U slučaju pretrage niza regularnim izrazom, rezultat operacije je logičko točno ili netočno, ako regularni izraz koristimo za substituciju onda se mjenja sama vrijednost varijable.
Pretraga teksta¶
Regularne izraze u
perl
-u možemo, u najjednostavnijem obliku, koristiti za pretragu određenih vrijednosti u nekom tekstu.U tom slučaju regularni izraz poprima oblik
/regex/mod
, gdje jeregex
naš regularni izraz amod
može biti prazan ili sadržavati specijalan znaki
kojim definiramo neosjetljivost na mala i velika slova.
Primjer
Pronalaženje određenog niza teksta u liniji pročitanoj sa ulaza:
#!/usr/bin/perl $recenica = "Svaka prava ptica leti."; print("Sto moram traziti? "); $trazi = <STDIN>; chomp($trazi); if ($recenica =~ /$trazi/) { print("Našao sam $trazi u $recenica.\n"); } else { print("Nisam pronašao.\n"); }
Substitucija teksta¶
Substitucija teksta primjenom regularnog izraza nam mjenja samu vrijednost varijable nad kojom radimo substituciju.
Substitucija se izvrši na prvom nizu kojeg pronađe regularni izraz ako ne zadamo drugačije određenim modifikatorom.
Regularni izrazi substitucije su oblika
s/regex/sub/mod
, gdje su značenja pojedinih elemenata slijedeća:znak
s
– govori da se radi o substitucijskom regularnom izrazu, mora biti zapisan kao takavregex
– niz specijalnih znakova koji nam predstavljaju regularni izrazsub
– niz znakova u koji mjenjamo znakove koji podudaraju zadanom regularnom izrazumod
– može biti prazan ili sadržavati specijalne znakove koji mjenjaju ponašanje regularnog izraza, ti znakovi su:g
– globalno, promjeni sve pojave zadanog regularnog izraza u nizui
– zanemari razliku između velikih i malih slova
Primjer regularnog izraza koji mjenja sva pojavljivanja znakova
123
za znakove456
:$string = "abc123def123"; $string =~ s/123/456/g; print($string);
Primjer zamjene djela niza neovisno o razlici velikih i malih slova:
$string = "abc123def123"; $string =~ s/Abc/def/gi; print($string);
Zadatak
Dana je vrijednost varijable
$var = "abc123abc";
Koje su vrijednosti
$var
nakon slijedećih zamjena?Provjeri pomoću
perl
skripte, zasebno za svaku zamjenu.$var =~ s/abc/def/;
$var =~ s/[a-z]+/X/g;
$var =~ s/B/W/i;
Prevođenje teksta¶
Regularne izraze možemo koristiti i za specificiranje tablice prevođenja pojedinih znakova.
Oblik regularnog izraza za prevođenje znakova je
tr/niz1/niz2/
, gdjeniz1
iniz2
moraju imati jednak broj znakova.Prevođenje se izvodi na način da se svaki znak iz prvog niza prevede u znak koji je na istom mjestu ali u drugom nizu.
$string = "abcdefghicba"; $string =~ tr/abc/123/; print($string);
Zadatak
Dana je vrijednost varijable
$var = "abc123abc";
Koje su vrijednosti
$var
nakon slijedećih prijevoda?Provjeri pomoću
perl
skripte, zasebno za svaki prijevod.$var =~ tr/a-z/A-Z/;
$var =~ tr/123/456/;
$var =~ tr/231/564/;
Dodatni zadaci¶
Zadatak
Pronađi grešku/e u slijedećem kodu:
#!/usr/bin/python $value = <STDIN> if ($value = 17) { print("Unio si broj 17.\n"); else { print("Nisi unio broj 17.\n");
Zadatak
Napiši skriptu koja provjerava je li korisnik unio pravilan e-mail.
Pretpostaviti ćemo da je pravilan e-mail oblika
tekst.tekst@inf.uniri.hr
, gdje jetekst
bilo koji niz znakova i znamenki.Ispisati
e-mail ispravan
u slučaju da je, u suprotnom ispisatineispravan e-mail
.