Documente Academic
Documente Profesional
Documente Cultură
Limbajul Perl Final Formatat Brosura
Limbajul Perl Final Formatat Brosura
Redactor
responsabil: conf. univ., dr. Vasile Moraru
Recenzent: prof. univ., dr. hab. Anatol Popescu
U.T.M., 2010
2
CONINUTUL
1. INTRODUCERE 4
2. TIPURI DE DATE 4
3. DATE SCALARE 5
4. LISTE 18
5 SUBRUTINE 27
6 FIIERE 30
7 EXPRESII REGULATE 33
8 TABELE HASH 42
9 BIBLIOGRAFIE 46
3
INTRODUCERE
TIPURI DE DATE
DATE SCALARE
Operaii aritmetice
Operaii logice
n Perl sunt admise operaiile logice tradiionale : < > <= >= =
!= care conduc la rezultatul adevrat sau fals.
5
Instruciunea de atribuire
Reprezentarea numerelor
$d = 0555;
$f = 0x666;
print d=$d f=$f\n
va afia: d=365 f=1638 n zecimal desigur.
6
Reprezentarea irurilor
Operaii de asignare
Incrementare i decrementare
7
In tabelul 1 sunt prezentate exemple de pre- i post incrementare
(decrementare) a variabilelor.
Fie i=3, j=15.
9
- substr($x, $poz, $lung) returneaz subirul din
irul $x ncepnd cu poziia poz i are lungimea
lung
- index($x, $a, $poz ) returneaz poziia ncepnd
cu care subirul $a se ntlnete prima dat n irul
$x. Parametrul $poz este opional i semnific
poziia de la care ncepe cutarea.
- rindex(($x, $a, $poz) efectueaz aceeai cutare
ca i funcia precedent cu deosebirea c se caut
de la sfritul irului spre nceput.
Instruciuni de baz
Instruciunea unless
10
Instruciuni de ciclu : while, until, for
Instruciunea until
12
Citirea datelor
13
Operatorul chomp()
14
while ( $a=<stdin> )
{ chomp($a);
print linia contine: $a\n;
}
print Sfarsitul programului\n.
La executarea programului se va apsa Enter la sfritul
liniilor cu excepia ultimei unde se va apas Ctrl+Z.
Remarc !
Citirea datelor de la tastatur conduce la apariia
caracterului \n la sfritul ei. Instruciunea chomp($a) terge
acest caracter, dar apoi la afiare este reintrodus din nou. Deci
programul precedent ar putea fi rescris n modul urmtor:
while ($a=<stdin>)
{ print linia conine: $a }
print Sfritul programului\n
Fr chomp($a); i \n n primul print din programul
precedent.
15
Operatori pentru iruri de caractere
Perl. x3 = Perl.Perl.Perl.
Sau Master_ x(6-2)=Master_Master_Master_Master_
$a=3; $b=9; $c=5;
$d = ($a+$b) x $c;
print $d\n;
Va afia : 1212121212
Conversiunea datelor
16
Tabelul 6 Operaii cu date de tip diferit
Operaia Rezultatul
$n1 + $n2 579
$n1 + $c1 690
$c1 + $c2 1464
$c1 . $c2 567897
$n1 . $c1 123567
$n1 . $n2 123456
Operatori de comparare
Operatorul cmp
17
Cteva funcii pentru iruri
LISTE
18
Fiecrei liste i este ataat o variabil scalar care conine
indicele maximal care se noteaz prin $#nume. Lungimea listei
fiind desigur $#nume+1.
Este posibil s iniializm listele i n modul urmtor:
@tab = (1..6, 7, 13..18);
@lista = (4, 5, 6);
@tab = (1, 2, 3, @lista, 7, 8, 9);
@lista = (Un, Doi);
@tab = (@lista, Trei);
Original este urmtoarea atribuire :
($a, $b, $c) = (1,2,3);
La afiare $a, $b i $c vor avea valori 1, 2 i 3. Putem
schimba valorile variabilelor:
($a, $b) = (2,3);
($a, $b) = ($b, $a);
n partea stng poate fi i o list
$a = 1; $b = 2; $c = 3;
($d, @lista) = ($a, $b, $c);
Vom obine d = 1, iar lista = (2,3).
Iar n cazul
@lista = (0, 1, 2, 3, 4, 5);
($d, @lista) = @lista;
Obinem d = 0, iar lista = (1, 2, 3, 4, 5)
Caz particular!
@lista = (1, 2, 3, 4, 5);
$l = @lista;
n acest caz scalara $l va avea valoarea lungimii listei
adic l=6, iar lista rmne intact, adic @lista = (0, 1, 2, 3, 4, 5);
se va ntmpla altfel n cazul urmtor
($a) = @lista;
Vom obine a= 0, iar lista = (0, 1, 2, 3, 4, 5).
Este posibil de realizat iniializri i atribuiri etajate:
@lista3 = (@lista2 = (@lista1 = (0, 1, 2, 3)));
Sau fr paranteze:
@lista3 = @lista2 =(@lista1 = (0, 1, 2, 3);
19
Accesul la elementele listei
22
Programul va afia:
Iteratia k=1 i=1
Iteratia k=2 i=3
Iteratia k=3 i=4
Salt
Iteratia k=4 i=6
Salt
Iteratia k=5 i=7
Salt
Iteratia k=6 i=8
Salt
Operatorul split
24
Operatorul join ()
Operatorul qw
Sortri complexe
Functia grep
Funcia grep are ca parametri un criteriu de selectare i o list
dat. Ea returneaz alt list care conine elementele ce
corespund criteriului de selectare. Criteriul poate fi i o expresie
regular. Compararea se va face cu variabila predefinit $_ .
Programul care urmeaz exemplific utilizarea funciei grep.
@lista1 = ( 4, -6, 5, 8, -9, 1, 2, -3) ;
@lista2 = grep { $_< 0 } @lista1 ;
print @lista2 \n ;
Programul va afisa :
-6 -9 -3
Functia map
Permite modificarea listei finale , dar i a celei date n caz de
necesitate. n urmtoarele dou exemple vor fi modificate listele
finale. n primul exemplu funcia inverseaz semnele numerelor
listei date.
@a = ( 4, -6, 5, 8, -9, 1, 2, -3) ;
@ b = map { -$_ } @ a ;
print @ b \n ;
Programul va afia :
26
-4 6 -5 -8 9 -1 -2 3
n exemplul doi la fiecare element al listei date se va aduga
caracterul a
@ a= ( Ionel, Marcel, Marin . ) ;
@ b= map { $ _. a } @ a ;
print @ b \ n ;
Programul va afisa :
Ionela Marcela Marina
SUBRUTINE ( FUNCII )
sub afisare
{
print "Salutare\n" ;
}
afisare;
Va afia :
27
Salutare
Forma a doua de apelare este utilizat n cazul cnd apelul este
nainte de definirea funciei.
&afisare;
sub afisare
{
print "Salutare\n" ;
}
Va afia ca i n cazul precedent :
Salutare
Funcia poate returna un rezultat. Exemplul urmtor conine o
subrutin iar apelarea subrutinei face parte dintr-o expresie
scalar i n acest caz se va returna un rezultat egal cu 1 adic
returnare cu succes.
sub afisare
{
print Salutare\n;
}
$a = 10 + &afisare;
print $a\n;
Va afia :
Salutare
11
n cazul programelor cu subrutine care returneaz rezultate
scalare trebuie s se respecte unele cerine. Ca exemplu vom
considera programul urmtor, care aparent ar trebui s returneze
un rezultat scalar fie $s fie $i. De fapt programul care urmeaz nu
va afia nimic.
sub calculare
{
$n=6; $i=1;
while ( $i<=$n )
{
$s+=$i;
$i++;
}
28
}
$rez=calculare;
print "$rez\n";
Explicaia este c ultima expresie evaluat de subrutin este
valoarea condiiei $i<=$n, care are valoarea ( 7<=6 ) adic este
fals i nu returneaz presupusa sum $s. Soluia corect este de a
evalua nc o dat variabila respectiv sau de a returna explicit
acest variabil aa cum este artat n programul urmtor.
sub calculare
{
$n=6; $i=1;
while ( $i<=$n )
{
$s+=$i;
$i++;
}
return $s; # $s;
}
$rez=calculare;
print "rez=$rez\n";
Programul va afia :
rez=21
Subrutina poate fi utilizat i cu parametri ca i n exemplul
urmtor. n acest caz prima instruciune va conine lista
parametrilor formali ai subrutinei pstrat n @_. Subrutina
media are ca parametri dou date scalare $n_ex i $n_cred, care
semnific numrul de examene susinute i respectiv numrul de
credite acumulate. Subrutina calculeaz i returneaz raportul
$n_cred / $n_ex prin intermediul variabilei rez.
sub media
{
( $n_ex, $n_cred ) = @_;
$rez = $n_cred / $n_ex;
return rez;
}
media ( 15, 78 );
29
print Ati acumulat $n_cred dupa $n_ex \n;
print Rezultat final : $rez\n;
Programul va afia :
Rezultat final : 5.2
Urmtorul program conine o subrutin care sorteaz elementele
unei liste date n modul urmtor : la nceput vor fi elementele pare
n ordine cresctoare, apoi cele impare n ordine descresctoare.
sub ordine ( )
{ if ( ! ( $a % 2 ))
{ if ( ! ( $b % 2))
{ return $a - $b ; }
else { return -1 ; }
}
else { if (! ( $b % 2 ))
{ return 1 ; }
else { return $b - $a ;}
}
}
@lista =( 4, 1, 14, 7, 12, 8, 6, 5, 31, 46, 9, 3, 24, 2);
@sortata = sort ordine ( @lista ) ;
print "@sortata \n " ;
Programul va afia :
2 4 6 8 12 14 24 46 31 9 7 5 3 1
FIIERE
31
In cazul unui eec la deschiderea fiierului utilizatorul nu va
cunoate cauza. Se recomand n aceste cazuri utilizarea unei
funcii suplimentare die, care afieaz explicaiile necesare.
open ( CITIRE, < fisier. pl ) or die fiierul nu s-a deschis
\n ;
De notat faptul c absena \n permite afiarea numelui
programului i a liniei unde a avut loc eecul. nregistrarea n
fiier se facu cu ajutorul funciei print, care are urmtoarea form
print INREGISTRARE ( SURSA ); unde INREGISTRARE
este numele fiierului n care se nregistreaz datele, care se
pstreaz n variabila SURSA a programului. nregistrrile pot fi
formatizate ca i n C sau C++. Funcia de adugare este
asemntoare cu cea de nregistrare, dar se deosebete prin faptul
c conine dou caractere >>. nchiderea fiierului are loc cu
funcia close cu un singur parametru numele fiierului nchis.
Programul urmtor creeaz un fiier format din 5 cuvinte
pe care l afieaz, pentru ca apoi s se adauge un nou cuvnt i n
final iar s se afieze coninutul fiierului.
Remarcm faptul c citirea din fiier se face cu operatorul
diamant adic < > , iar afiarea pe ecran n mod trivial cu
operatorul print fr parametri.
open (INREGISTRARE, >colegi.txt)
or die Regret, dar fisierul nu poate fi deschis \n;
print Se creeaza fisierul colegi.txt cu 5 colegi \n;
for ($i=1; $i<=5; $i++)
{
print Introdu prenumele colegului \n;
$b = <STDIN>;
print INREGISTRARE ($b\n);
}
print Fisierul a fost creat \n;
close(INREGISTRARE);
EXPRESII REGULATE
33
studiate deja conin expresii regulate. Este cazul funciilor split
sau grep.
n dependen de funcia realizat expresiile regulate pot
fi divizate n 2 grupuri :
- corespundere ( n englez pattern matching ) sau model,
ablon, uzor;
- substituire.
Coresponderea este procesul de testare a unui ir de caractere n
sensul c conine un model.
Ca exemplu am putea formula urmtoarele ntrebri i rspunde
cu un model. Conine irul dat cel puin 3 caractere consecutive
majuscule ? Conine irul dat un subir care se repet de 2 ori i
are cel puin 5 caractere?
Sintaxa coresponderii este: m/model/
unde - m - semnific modelul coresponderii cutat, iar
caracterele / servesc pentru a delimita modelul corespondenei.
Aceast funcionalitate permite de asemenea i extragerea
subirurilor din variabila dat fr a o modifica. De exemplu
pentru a recupera primul numr care face parte din variabil
putem apela la corespundere.
La rndul ei substituia permite transfomarea irului din
variabila dat. De exemplu am putea nlocui in variabila $v toate
subirurile tata cu mama, sau ianuarie cu februarie sau am putea
elimina toate cuvintele care sunt ntre ghilimele.
Sintaxa substituirii este : s/model/ir/
unde s semnific funcionalitatea de substituire, caracterele /
delimiteaz modelul care va fi nlocuit cu ir.
n programe Perl expresiile regulate n mod tradiional fac
parte din instruciunile de atribuire care conin un caracter
suplimentar tilda adic =~ care semnific faptul c variabila
din partea stng a instruciunii este legat de expresia regular.
Programul care urmeaz exemplific utilizarea n mod general a
corespondenei i a substituiei.
$a = "tototatatiti";
if ($a =~ m/tata/ ) { print "Contine\n"; }
$a = ~ s/tata/MAMA/;
34
print "$a\n";
Executarea programului conduce la afiarea urmtoarelor
rezultate :
Contine
totoMAMAtiti
De remarcat faptul c expresia regular utilizat va nlocui numai
primul subir MAMA ntlnit. Vom explica mai departe cum pot
fi nlocuite toate subirurile ntlnite.
n mod implicit ca i n multe funcii Perl poate fi utilizat
i variabila predefinit $_.
Exemplul urmtor consider un fiier cu numele text.txt care
conine diferite cuvinte. Coninutul fiierului este stocat n
variabia predefinit @ARGV i apoi accesat n regim secvenial
linie cu linie n variabila predefinit $_ prin intermediul ciclului
while i a operatorului diamant. n ciclu se verific coninerea
irului aaa n linia curent i afiarea ei n caz afirmativ. S
presupunem c fiierul conine textul urmtor :
@ARGV = ( "text.txt" );
while ( < > )
{
if ( /aaa/ ) { print "$_\n"; }
}
S presupunem c fiierul conine textul urmtor :
taaaata
mama
baaba
aaaaaaa
naaanaaana
paaap
n acest caz programul va afia :
taaaata
aaaaaaa
naaanaaana
paaap
35
Caractere utilizate pentru abloane
37
Totodat vom nota i faptul c caracterele * + ? reprezint
cuantificatori fr prezena acoladelor. De exemplu, caracterul *
semnific faptul c ablonul poate s se repete de zero sau mai
multe ori. Deci expresia regular m/a*/ va recunoate cuvintele
vide sau a, aa, aaa, aaaa etc. Iar n cazul expresiei m/za*/
cuantificatorul * se refer numai la caracterul a i deci se va
recunoate z, za, zaa, zaaa, zaaaa etc. Aceast precizare este
important n cazul substituirii, fiindc cuantificatorul * va
recunoate numrul maximal posibil de caractere aa cum se vede
n programul urmtor :
$v = "vbaaal";
$v =~ s/ba*/hello/;
print "$v\n";
Expresia ba* va recunoate irul baaa i deci programul va
afia :
Vhellol
Cuantificatorii pot fi aplicai nu numai la un singur
caracter, dar la un interval. De exemplu, ablonul m/[a-z-]{4 , 6}/
va recunoate orice ir de caractere cu lungimea de 4, 5 sau 6
caractere inclusiv i un defis.
n final vom remarca i faptul c cuantificatorul * este o form
mai scurt a cuantificatorului { 0 , } i respectiv + i ?
corespund cuantificatorilor { 1 , } {0 , 1 }.
n Perl exist o serie de scurtturi:
\d orice cifr, echivalent cu [0-9]
\D orice diferit de cifr, echivalent cu [^0-9]
\w un alfanumeric, echivalent cu [09a-zA-Z_]
\W orice diferit de alfanumeric
\s spaiere echivalent cu [\ n\t\r\f]
\S orice diferit de spaiere.
38
Regruparea
abloane alternative
Referine n arier
Variabile definite
TABELE HASH
Declaraii i utilizare
44
Tabele hash i liste
45
Bibliografie
46
UNIVERSITATEA TEHNIC A MOLDOVEI
LIMBAJUL PERL
Ciclu de prelegeri
Chiinu
2010
47
UNIVERSITATEA TEHNIC A MOLDOVEI
Facultatea Calculatoare, Informatic i Microelectronic
Catedra Informatica Aplicat
LIMBAJUL PERL
Ciclu de prelegeri
Chiinu
U.T.M.
2010
48