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
_
.
- naziv varijable mora započeti znakom
-
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
- nizovi znakova, ograđeni navodnicima --
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
==
.
Hint
==
nije isto što i znak za dodjeljivanje vrijednosti varijable =
.
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 takav regex
-- niz specijalnih znakova koji nam predstavljaju regularni izrazsub
-- niz znakova u koji mjenjamo znakove koji podudaraju zadanom regularnom izrazu-
mod
-- 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
- znak
-
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
.
Author: Luka Vretenar