ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 11
ProgramareProgramare PerlPerl IntroducereIntroducere
Sabin-Corneliu Buraga Facultatea
de Informatica, UAIC, Romania
http://www.infoiasi.ro/~busaco/
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 22
“There’s no teacher who can teach anything new.He can just help us to remember the things we always knew.”
Michael Cretu
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 33
CuprinsCuprins•
Caracterizare
a limbajului
Perl
•
Manualul
Perl on-line•
Primul
program Perl
•
Sintaxa•
Tipuri
de date
•
Operatori•
Instructiuni
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 44
CaracterizareCaracterizare•
Practical Extraction and Report Language
•
Limbaj
de programare
(compilat/interpretat)•
Creat
de Larry Wall
•
20 ani
de Perl la 18 decembrie
2007•
Utilizat
initial la prelucrarea
sofisticata
a informatiilor
textuale•
Disponibil
gratuit
sub forma de distributii,
pe
o multitudine
de platforme (UNIX/Linux, Windows, MacOS,…)
–
Active Perl pentru
Windows–
Perl disponibil
in orice
distributie
de Linux
•
www.perl.com
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 55
CaracterizareCaracterizare•
Favorit
al…
–
Administratorilor
de sistem–
Programatorilor
Web
–
Specialistilor
in diverse domenii
•
Procesari
rapide
ale textelor
de mari
dimensiuni•
Posibilitati
de utilizare
a expresiilor
regulate
•
Prelucrarea
avansata
a resurselor
sistemului
de operare
si
a documentelor
XML
•
Conectivitate
strinsa
cu bazele
de date•
Facilitati
pentru
realizarea
de scripturi
CGI
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 66
CaracterizareCaracterizare
•
Filosofia– Lucrurile
simple sa
se realizeze
usor,
iar
cele
complexe
sa
nu
fie imposibil de implementat
– Modalitati
multiple de programare
Perl, in functie
de experienta
dezvoltatorului
de aplicatii
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 77
CaracterizareCaracterizare
•
Modular programare
procedurala
si
orientata-obiect
•
Portabil•
Expresiv
si
puternic
–
expresii
regulate,
tablouri
si
liste, limbaj
de sistem (fisiere, procese, socket-uri,…)
•
Viteza
sporita
in dezvoltarea
programelor mediul
Perl ofera
un compilator-interpretor
•
Gratuit
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 88
CaracterizareCaracterizare
•
Disponibilitate–
CPAN (Comprehensive Perl Archive Network)•
http://www.perl.com/CPAN/
•
Posibilitati
de ajutor–
man perl
–
perldoc
(i.e. perldoc
-f split)–
www.perl.com/perl
–
www.perldoc.com–
A se vedea
si
resursele
bibliografice
ale cursului
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 99
ManualulManualul•
Sectiuni
importante:
–
perl
–
o trecere
în
revistă
a documentaţiilor
Perl–
perlfaq
– răspunsuri
la întrebările
puse
frecvent
despre
Perl (Frequently Asked Questions – FAQ) –
perlsyn
–
sintaxa
limbajului
(vezi
şi
perlrun
– execuţia
script-urilor
Perl, perlfunc
– funcţii
predefinite,
perlsub
–
subrutinele
Perl)–
perldata
–
structurile
de date Perl (vezi
şi
perlre
–
expresii
regulate, perldsc
–
introducere
în structuri
de date, perlvar
–
variabile
predefinite)
–
perlop
–
operatorii
şi precedenţa lor–
perlmod
–
modulele
Perl
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1010
PrimulPrimul programprogram#!/usr/bin/perlfor ($i = 0; $i < 10; $i++) {print ("Salut din Perl!\n");
}
•
Editare cu orice editor de texte favorit: joe
primul.pl
•
Setarea
drepturilor
de executie: chmod
+x primul.pl
•
Invocarea
interpretorului
Perl pentru
executia
programului:
perl
primul.pl
sau
./primul.pl
Obligatoriu in UNIX/
Linux
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1111
SintaxaSintaxa
•
Inspirata
din limbajul
C•
Delimitatorii
intre
diverse constructii
sunt
spatiile
albe
(spatiul, TAB, NewLine)•
Case-sensitive (perl
≠
Perl)
•
Comentarii
precedate
de caracterul
#•
Instructiuni
terminate de ;
•
Parantezele
acolade
{} sunt
delimitatori de blocuri
de instructiuni
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1212
TipuriTipuri de datede date
•
Variabilă
= zonă
(de obicei
contiguă) de memorie
în
care se stochează
o valoare
de
un anumit
tip, zonei
fiindu-i
asociat
un nume (identificator
al acelei
variabile)
•
Această
zonă
poate
fi
publică
sau
privată, permanentă
sau
temporară
pe
parcursul
execuţiei
unui
program•
Numele
unei
variabile
trebuie
să
înceapă
cu o literă şi poate conţine
caracterele alfa-numerice
şi "_"
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1313
TipuriTipuri de datede date
•
Clasificare–Tipuri
scalare
(simple)
•Intregi
(cu semn
sau
nu)•Numere
flotante
•Siruri
de caractere–Tipuri
complexe
•Tablouri
indexate•Tablouri
asociative
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1414
TipuriTipuri de datede date
•
Scalare
(simple)–
Intregi
cu semn, numere
flotante,
siruri
de caractere–
Variabilele
de tip scalar au numele
precedat
de $
–
Nu
trebuie
declarate
explicit inainte
de a fi
utilizate–
Implicit, o variabila
numerica
are valoarea
0,
iar
una
caracter
are valoarea
sirul
vid
""$nr_studenti++;$pi = 3.14152965;$limbaj = "Perl";
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1515
TipuriTipuri de datede date
•
Scalare
(simple)–
Variabilele
de tip sir de caractere
au valori
incadrate
intre
ghilimele
sau
apostrofuri$prenume = "Hermann";$nume = 'Hesse';# variabilele vor fi expandate$scriitor = "$prenume $nume";# variabilele nu vor fi expandate$scriitor2 = '$prenume $nume';
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1616
TipuriTipuri de datede date
•
Scalare
(simple)–
Pentru
generarea
unor
caractere
speciale
(e.g., NewLine, TAB,…) se vor
utiliza caracterele
escape (ca in cazul
limbajului
C)
•\n ≡
NewLine•\t ≡
TAB
•\" ≡
"•\' ≡
'
$editura = 'O\'Reilly';$salut = "Buna ziua!\nSalut iar!\n";
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1717
TipuriTipuri de datede date
•
Complexe–
Tablouri
indexate
•
Liste
ordonate
de valori
scalare
(numere, siruri)•
Elementele
listei
sunt
disponibile
prin
intermediul
unui
indice
numeric•
Numele
unor
variabile
de tip tablou
indexat
incepe
cu @
@limbaje = ("Lisp", "C", "Java", "Perl");@mix = ("Pink", 1978, "Floyd", $pi);$primul_limbaj = $limbaje[0];@primele_3 = @limbaje[0..2]; # sub-tablou
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1818
TipuriTipuri de datede date
•
Complexe–
Tablouri
indexate
•
Un tablou
poate
contine
elemente
eterogene, de tipuri
scalare
diferite
•
Pentru
a adauga
si
sterge
elemente
la sfirsitul
unui
tablou se vor
folosi
functiile
push()
si
pop()
push (@limbaje, "Prolog"); $eliminat = pop (@limbaje);
•
Aflarea
lungimii
unui
tablou$nr_limbaje = @limbaje; $nr_limbaje = scalar (@limbaje);
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1919
TipuriTipuri de datede date
•
Complexe–
Tablouri
indexate
•
Pot fi
utilizate
si
in partea
stinga
a unei
atribuiri($primul, $al_doilea) = @limbaje; ($primul, @restul) = @limbaje; ($studenti, $profesori) = ($absenti, 3);
•
Elementele
se pot ordona
cu functia
sort()•
Inversarea
unei
liste
de elemente
se poate
face cu reverse()
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2020
TipuriTipuri de datede date
•
Complexe–
Tablouri
asociative
•
Indicele
numeric este
substituit
de un sir de caractere•
Liste
de perechi
(cheie, valoare)
•
Cheile
sau
valorile
nu
sunt
ordonate•
Variabilele
de tip tablou
asociativ
sunt
prefixate
de %
%curente = ("realism" => 4,"expresionism" => 10,"modernism" => 33);
$romane_moderne = $curente{"modernism"};
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2121
TipuriTipuri de datede date
•
Complexe–
Tablouri
asociative
•
Intre
acolade
vor
fi
precizate
doar
nume
de chei, nu
valori
ale cheilor
•
Cheile
nu
pot fi
accesate
speficind
valorile
lor intre
acolade
•
O cheie
trebuie
sa
fie unica, dar
valorile
cheilor
pot fi
duplicate
•
Lista
cheilor
este
furnizata
de functia
keys()•
Lista
valorilor
este
data de functia
values()
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2222
TipuriTipuri de datede date
•
Complexe–
Tablouri
asociative
•
Functia
each()
furnizeaza
o pereche
(cheie, valoare)@lista_curentelor = keys %curente;($curent, $romane) = each (%curente);•
Inserarea
unui
element intr-un tablou
asociativ
se face printr-o
constructie
de genul:# 10 romane baroce$curente{"baroc"} = 10;
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2323
TipuriTipuri de datede date
•
Complexe– Tablouri
asociative
•
Exemplu de parcurgere a unui tablou asociativwhile (($curent, $romane) = each (%curente)) {
print "Din curentul $curent sunt disponibile $romane romane.\n";
}
•
Sortarea cheilor –
functia sort()# Lista sortata a curentelor @curente = sort (keys (%curente));
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2424
TipuriTipuri de datede date
•
Complexe–
Tablouri
asociative
•
Un element se poate
elimina
cu delete()•
Existenta
unui
element se verifica
prin
exists()
if exists ($curente{"baroc"}) { delete ($curente{"baroc"});
}
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2525
TipuriTipuri de datede date
•
Mai multe
despre
variabile–
Numele
$variabila, @variabila
si
%variabila
se refera
la tipuri
diferite
de variabile
si se pot utiliza
fara
a genera ambiguitati
$studenti
≠
%studenti
≠
@studenti–
Variabile
predefinite
•
$0
-
numele
programului
care se executa•
$_
- intrarea implicită
sau
spatiul
de cautare
intr-un sir
•
@ARGV
-
argumentele
furnizate
scriptului
($ARGV[0] refera
primul
argument, nu
numele
programului)
•
%ENV
-
variabilele
de mediu
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2626
TipuriTipuri de datede date
•
Mai multe
despre
variabile–
Testarea
existentei
unei
variabile
se poate
realiza
cu functia
defined()–
In mod normal, variabilele
vor
fi
disponibile
pe
tot
cuprinsul
programului
–
domeniul
de vizibilitate (scopul) este
implicit global
–
Pentru
a face o variabila
locala o vom
declara
cu my
sau
local
my $scriitor_preferat = "Hermann Hesse";
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2727
OperatoriOperatori
•
Aritmetici: + -
* / % **$unu = 1;$doi = $unu + $unu;$patru = $doi * 2;$doi = $patru / $doi;$opt = $doi ** 3; # 2 la puterea 3$unu = ($opt - $unu) % 2; # restul impartirii
•
De incrementare/decrementare: ++ --$unu = 1;$doi = ++$unu; # $doi = 2, $unu = 1$doi = $unu++; # $doi = 1, $unu = 2$scriitori++; # $scriitori = $scriitori + 1
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2828
OperatoriOperatori
•
Destinati
sirurilor: x .# un rind de 80 de caractere ~ @rind = ('~') x 80;# concatenarea a doua siruri$salut = 'Buna' . 'ziua';
•
De comparare
(relationali):–
Comparare
numere: <, >, <=, >=, ==, !=
–
Comparare
siruri: lt, gt, le, ge, eq, ne•
De definire
a unui
interval: ..
print (1 .. 33); # de la 1 la 33@combinatii = ('aa' .. 'zz');
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2929
OperatoriOperatori
•
Logici: and or not$to_be = 1;$fals = $to_be and not $to_be;$adevarat = (7 > 3) or (3 <= $studenti);
–
Constructii
echivalente: and ≡
&&,
or ≡
||,
not ≡
!$fals = $to_be && !$to_be;
•
De test: ?:print $nume eq "Hesse" ? "E el!" : "Nu-i el!";
•
De asignare: $variabila OP= $valoare; # OP – un operator Perl$variabila = $variabila OP $valoare;
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3030
InstructiuniInstructiuni
•
Expresii
evaluate pentru
efectele
lor
colaterale•
Formeaza
partea
centrala
a oricarui
program
Perl, prelucrind
datele
stocate
in variabile•
O secventa
de instructiuni
formeaza
un bloc,
delimitat
in general intre
acolade
{}•
Fiecare
instructiune
trebuie
terminata
de ;
•
In afara
de instructiuni, un program mai
poate
cuprinde
declaratii
•
Tipuri
de instructiuni: de asignare, de test, de control
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3131
InstructiuniInstructiuni
•
De asignare–
Ataseaza
unei
variabile
o valoare
corespunzatoare
unui
anumit
tip de date
–
Exemple: $numar_romane_citite = 33;
$numar_romane_citite += 3; $cursuri[1] = ’Programare Perl’;
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3232
InstructiuniInstructiuni•
De test –
if
–
Evalueaza
o expresie
si
in functie
de valoarea evaluata
se va
executa
un bloc de instructiuni
if ($nr_studenti >= 30) {print ("Multi studenti la curs:)\n");
} else {print ("Cam putini studenti!\n");
}–
Un sir este
evaluat
ca fals, daca
este
vid
""
sau
contine
o valoare
nula
"0"–
Un numar
e evaluat
ca fals
daca
este
0
sau
0.0
–
Orice
valoare
nedefinita
este
considerata
falsa
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3333
InstructiuniInstructiuni•
De test –
unless
–
Complementara
lui
ifunless ($nr_studenti >= 30) {print ("Cam putini studenti!\n");
} else {print ("Multi studenti la curs:)\n");
}–
Constructia
else
poate
lipsi
–
Atit
if
cit si
unless
pot fi
scrise
in forma postfixataprint "E chiar el" if $nume eq "Hesse" or
$nume eq "Hermann";
$nr_studenti-- unless $nr_studenti;
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3434
InstructiuniInstructiuni•
De control –
while •
Evalueaza
o expresie
si
daca
valoarea
evaluata
este
adevarata
se va
executa
blocul
de instructiuni, dupa
care se va
reevalua
expresia
si
daca
valoarea
evaluata
este
adevarata
se va
executa
blocul
de instructiuni, dupa
care se va
reevalua
expresia
si
daca…
(aproape
ad infinitum)
$studenti = 1;while ($studenti <= 10) {
print ("$studenti pe pinza de paianjen...\n");$studenti++;
}print "Gata!\n";
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3535
InstructiuniInstructiuni•
De control –
do•
Complementara
lui
while, evaluarea
expresiei
realizindu-se dupa
executia
macar
o singura
data a blocului
de instructiuni
do { $studenti++;print "Suntem $studenti\n";
} until $studenti > 10;–
for •
Utilizata
de obicei
ca instructiune
iterativa
for ($stud = 1; $stud <= 10; $stud++) {print "$stud pe pinza...\n";
}
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3636
InstructiuniInstructiuni•
De control –
foreach•
Utilizata
de obicei
pentru
iterarea
tablourilor
@note = (9, 9, 7, 10, 5, 8, 8); foreach $nota ( @note ) {
print "$nota\n" unless $nota != 10; } print "Gata\n";
foreach $curent (sort (keys (%curente))) {print "$curent are $curente{$curent} romane\n";
} •
Variabila
de ciclu
este
o referinţă
a listei,
nu
o copie
a acesteia
(elementele
listei
se pot altera!)
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3737
InstructiuniInstructiuni
•
De control – next
•
Permite
saltul
la finalul
blocului
de instructiuni
si inceperea
urmatoarei
iteratii
la un while, do, for,
foreach
(similar cu continue din C/Java)
for ($grupa = 1 ; $grupa <= 4 ; $grupa++){next if $grupa == 2;print "Grupa: $grupa\n";
}
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3838
InstructiuniInstructiuni•
De control – last
•
Va
finaliza
ciclul
de instructiuni
si
va
continua cu urmatoarea
instructiune
dupa
blocul
de
instructiuni
al unui
while, do, for
sau
foreach
foreach $grupa (1 .. 4) {if ($grupa == 2) { last }; print "Grupa: $grupa\n";
}print "Gata!\n";
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3939
PerlPerl•
Exercitii–
Sortarea
unui
tablou
asociativ
avind
drept
chei
nume
de clienti
si
drept
valori
numarul
de produse
comandate
de pe
un sit de comert
electronic–
Reprezentarea
unei
comunitati
de prieteni
ori
cunoscuti
si
determinarea
celor
mai
“populare” persoane
(avand
anturajul
cel
mai
mare)
–
Modelarea
unei
colectii
de CD/DVD-uri
si realizarea
de cautari
conform unor
criterii
(simple sau
multiple) furnizate
de utilizator