Sunteți pe pagina 1din 48

Lucrarea metodic conine o descriere a limbajului de

programare Perl. Sunt prezentate tipurile de date existente n Perl


i anume date scalare, liste i tabele hash. O atenie deosebit se
acord expresiilor regulate necesare pentru procesarea textelor.
Scopul principal al materialului didactic este prezentarea
posibilitilor limbajului Perl. Exemplele de programe Perl din
lucrare pot servi drept ndrumare pentru ndeplinirea lucrrilor de
laborator i a proiectului de an la disciplina Programare bazat
pe reguli i expresii regulate.
Lucrarea este destinat n primul rnd studenilor
specialitii Informatica Aplicat ciclul II masterat care
studiaz cursul indicat, precum i studenilor de la alte specialiti
ale facultii Calculatoare, Informatic i Microelectronic de la
U.T.M.

Autori: conf. univ., Liviu Carcea


conf. univ., dr. Victoria Bobicev

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

Denumirea limbajului Perl vine de la Practical


Extraction and Report Language. Este un limbaj de scripting
inventat de ctre Larry Wall pentru a gestiona fiiere text foarte
mari. Prima versiune a aprut n 1988. Spre deosebire de C++,
Java i alte limbaje de programare limbajul Perl este un limbaj
interpretat i nu compilat.
Dup lansarea sa limbajul a fost acceptat de utilizatori i
fiind propus doritorilor pe Usenet a provocat dialoguri, ntrebri,
discuii care au condus la elaborarea i integrarea n Perl a unui
numr extrem de mare de module elaborate de utilizatori.
In final Perl a devenit un limbaj de programare care mbin mai
multe caliti :
prelucrarea fiierelor de tip text ;
generarea rapoartelor ;
administrarea sistemelor ;
este disponibil pe platformele UNIX, Windows, Linx ;
Actualmente limbajul este centralizat de ctre CPAN
(Comprehensive Perl Arhive NetWork).

TIPURI DE DATE

Limbajul Perl utilizeaz 3 tipuri de date:


Un tip simplu numit scalar i dou tipuri structurate : liste
indexate (tablouri) si h (hash).
In funcie de contextul utilizat, o dat scalar poate fi
considerat ca :
o valoare numeric ;
un ir de caractere ;
o variabil boolean ;
In ultimul caz se consider c valoarea numeric 0 (zero) sau
un ir vid ( ) reprezint valoarea Fals. Orice alt valoare este
echivalent cu Adevrat.
4
Primul caracter al (numelui) identificatorului va determina
tipul datelor.
Caracterul $ semnific o dat scalar ;
Caracterul @ semnific o list ;
Caracterul % semnific un h (hash) ;
De notat faptul c tipurile au zone proprii de identificare.
Deci, ntr-un program am putea utiliza unul i acelai nume pentru
variabile de tip diferit $a, @a, %a.
Numele unei date scalare este un ir de caractere, cifre i
semnul _ (subliniere). Limbajul ine cont de caractere minuscule
i majuscule, care sunt diferite n program.
De remarcat faptul c orice variabil utilizat n partea dreapt
a unei instruciuni de atribuire fr ca s fie n prealabil afectat
de o valoare este considerat c are valoarea specific undef. n
cazul numerelor ea este egal cu 0 (zero).

DATE SCALARE

Operaii aritmetice

Perl permite urmtoarele operaii aritmetice : + - * /


% (restul ntreg de la mprirea a dou numere ntregi) i
** (ridicare la putere). Operaia mprire ine cont de context.
Exemple : 65/5 produce rezultatul 3, 10.5/0.5 produce rezultatul
2, iar 10/6 produce rezultatul 1.666666666666667.
Operaia 3**5 produce rezultatul 243 iar operaia 17 % 5 va
produce rezultatul 2 .

Operaii logice

n Perl sunt admise operaiile logice tradiionale : < > <= >= =
!= care conduc la rezultatul adevrat sau fals.

5
Instruciunea de atribuire

$a = 32 ; atribuie variabilei a valoarea 32 .


$b = $a + 6 ; atribuie variabilei b rezultatul operaiei
a+6 .
$b = $b * 2 ; mrete b de 2 ori .
$c = 10 + ($a = 52) ; atribuie variabilei a valoarea 52, apoi
adaug 10 i atribuie rezultatul variabilei c .
$d = ($c = 23) ; atribuie variabilei c valoarea 23, apoi
rezultatul se atribuie lui d .
Instruciunea precedent este echivalent cu : $d = $c = 23 ;
Urmtoarele 2 linii conin exemple de atribuire a numerelor reale
i a irurilor.
$r = 2.735 ;
$s = Salut ;
Remarcm faptul c sfritul instruciunii de atribuire este notat
prin ; ( punct i virgul).

Reprezentarea numerelor

In Perl toate numerele sunt reprezentate n forma cu punct


mobil dubl precizie. Noiunea de numr ntreg nu exist, el este
reprezentat ca un numr real cu dubl precizie.
Se poate de specificat baza sistemului de numeraie la
reprezentarea numerelor. Numerele care ncep cu 0 (zero)
reprezint o valoare n sistemul octal, iar cele care ncep cu 0x
(zero si x) n sistemul hexazecimal.
In acest caz urmtorul program:

$d = 0555;
$f = 0x666;
print d=$d f=$f\n
va afia: d=365 f=1638 n zecimal desigur.

6
Reprezentarea irurilor

In Perl exist 2 tipuri de iruri de caractere: cele reprezentate


prin ghilimele i cele reprezentate prin apostrofuri.
Sa consideram scripturile :
$s = Buna ziua ;
$t = $s tuturor ;
$b = $s tuturor ;
Variabila $t este afectat de un ir de caractere care conine i o
referin la alt variabil $s , dat fiind faptul c irul de caractere
este ntre ghilimele. n acest caz mecanismul de substituie este
activ i variabila $s va fi nlocuit prin valoarea sa adic Buna ziua
i deci vom obine pentru variabila $t valoarea :
Buna ziua tuturor.
In cazul variabilei $b irul care i se atribuie este ntre
apostrofuri, iar n acest caz mecanismul de substituie este
dezactivat i deci pentru variabila $b vom obine rezultatul:
$s tuturor.

Operaii de asignare

n Perl putem nlocui instruciunile de atribuire cu operaii de


asignare.
$a = $a+5; este echivalent cu $a + = 5;
$a = $a - 5; este echivalent cu $a - = 5;
$a = $a*5; este echivalent cu $a * = 5;
$a = $a**5; este echivalent cu $a ** = 5;
$a = $a/5; este echivalent cu $a / = 5;
Este permis s scriem: $b = ( $a + = 9) ; ce va produce
afectarea simultan a variabilelor $a i $b cu valoarea 14.

Incrementare i decrementare

In cazul creterii unei variabile cu o unitate, adic


$a=$a + 1; putem scrie $a + = 1; sau ++$a ; sau $a++ ;

7
In tabelul 1 sunt prezentate exemple de pre- i post incrementare
(decrementare) a variabilelor.
Fie i=3, j=15.

Tabelul 1 Operaii de incrementare


Operaia Echivalent Rezultat
$i = ++ $j ; j=j+1; i=j; i = 16 j = 16
$i = $j ++ ; i=j; j=j+1; i = 15 j = 16
$j = ++ $i +5 ; i =i +1 ; j = i + 5 ; i=4 j=9
$j = $i +++ 5 ; j = i + 5 ; i =i +1 ; i=4 j=8
$k = $i ++ + ++$j ; j=j+1; k=i+j; i = 4 j = 16
i =i +1 ; k = 19

De remarcat faptul c este interzis a scrie :


++2 pentru a obine 3 ;
++($a + $b) ;

Conversiuni numere-ir de caractere

Limbajul Perl permite mbinarea datelor scalare numere-ir


de caractere n expresii i instruciuni de atribuire:
$sir = 123;
$numar = 214;
$produs = $sir * $numar;
print Produsul este $produs \n;
Programul va afia: Produsul este 26322 ( adic produsul
irului 123 cu numrul 214)

Funcii defined / undefined

O variabil poate fi utilizat fr a fi iniializat (fr ai fi


atribuit o valoare). De exemplu, instruciunea urmtoare
$a = $b ;
este corect chiar dac $b apare prima dat n program n aceast
instruciune i deci nu are nicio valoare. In acest caz variabila $a
exist i va avea valoarea undefined, iar $b din contra nu exist.
8
Testarea existenei se va face cu ajutorul funciilor defined /
undefined prezentate n tabelul 2.

Tabelul 2 Funciile defined/undefined


Funcia Variabila $a Variabila $a
exista nu exist
$r = defined ($a); $r este adevrat $r este fals
$r = undefined ($a); $r este fals $r este adevrat

Operatorul spaceship (< = >)

Acest operator permite stabilirea unei relaii de ordine


ntre dou valori numerice aa cum este prezentat n tabelul 3.
Este utilizat n procesul de sortare a datelor.

Tabelul 3 Operatorul < = >


Relaia ntre $a i $b Operaia Rezultat
$a > $b $x = $a < = > $b +1
$a = $b $x = $a < = > $b 0
$a < $b $x = $a < = > $b -1

Operatori i funcii pentru date scalare

Funciile urmtoare manipuleaz cu date numerice:


- sin($x) i cos($x) returneaz sinus i cosinus de
$x
- exp($x) returneaz e la puterea $x
- log($x) returneaz logaritm n baza e de $x
- abs($x) returneaz valoarea absolut de la $x
- sqrt($x) returneaz rdcina ptrat din $x
- int($x) returneaz partea ntreag $x
n contextul irurilor de caractere putem utiliza
urmtoarele funcii :
- length($x) returneaz lungimea irului $x

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 de ramificare if are forma urmtoare:


if ( conditie ) { instructiune_1 } else { instructiune_2 } ;
Exemplul urmtor conine instruciunea if care permite afiarea
rezultatului comparrii variabilelor $a i $b
$a = 3; $b = 2;
if ($a > $b) { print A>B\n } else { print B>A\n};
De remarcat faptul c expresia condiiei este evaluat ca un ir de
caractere. In cazul numerelor se vor converti n ir de caractere.
Dac irul obinut este vid ( ) sau conine numai caracterul 0
( 0) zero, atunci valoarea expresiei este fals. Orice alt caz
conduce la valoarea adevrat.

Instruciunea unless

Instruciunea unless reprezint un if care nu are


ramificaia then, dar are ramura else i care se execut atunci
cnd condiia este fals.
unless (conditie) { instructiune };
Fragmentul urmtor
$a = 3; $b = 4;
unless ($a > $b) { print A<B\n };
va afia: A < B

10
Instruciuni de ciclu : while, until, for

Instruciunea while are forma :


while (expresie) {
instructiune_1;
instructiune_2;
};
Instruciunile corpului ciclului while se vor executa atta timp
ct condiia va fi adevrat.
Se consider urmtorul cod surs:
$a = 2; $b = 9;
while ($a*$b < $a*$b/2)
{
$a++;
print a=$a\n;
}
Programul va afia: a=3
a=4
a=5

Instruciunea until

Pentru ca instruciunile corpului ciclului until s se


execute condiia trebuie s fie fals.
n cazul programului urmtor:
$a = 2 ; $b = 9 ;
until ($a++ * $a > $a * $b/2)
{ print a = $a\n;
$a++;
};
se va afia urmtorul rezultat: a=2
a=3
a=4
11
Instruciunea for

Instruciunea for are forma urmtoare:


for (iniializarea parametrilor; condiia de terminare;
schimbarea parametrilor)
{ instructiuni };
Programul care urmeaz va afia exact aceleai rezultate
ca i cele obinute cu instruciunea until din exemplul precedent.
for ($a = 2; $b = 9; $a*$b<$a*$b/2; $a++)
{ printf a=$a\n };
Rezultatul executrii programului :
a=2
a=3
a=4
Instruciunile de ciclu pot s conin n interiorul corpului
su instruciunile next i last care permit modificarea executrii
instruciunilor de ciclu. Astfel instruciunea next va provoca
executarea iteraiei urmtoare a ciclului evitnd instruciunile care
se afl dup next, iar instruciunea last va fora terminarea
instruciunii de ciclu. Programul care urmeaz exemplific
utilizarea acestor instruciuni.
$j=1, $s=5;
while ( j<9 )
{ $s+=3;
if ($j>6 ) { last; }
for( $i=0; $i<2; $i++ )
{ $j++; - - $s; }
if ($j<6 ) { next; }
$s+=2;
}
print " s=$s\n";
Programul va afia : s=19

12
Citirea datelor

Citirea datelor de intrare de la tastatur se face n modul


urmtor:
$a = <stdin>; - unde stdin este numele fiierului standard de
intrare.
Toate caracterele introduse de la tastatur inclusiv \n
(Enter) vor fi atribuite variabilei $a. In multe cazuri acest caracter
nu face parte din datele introduse. tergerea lui se va face cu
funcia chop ($a); adic dup citire putem terge caracterul \n cu
funcia chop.
$a = <stdin>;
chop ($a);
n consecin putem scrie o singur instruciune n modul
urmtor:
chop ($a = <stdin>); sau $b = chop ($a);
Remarcm faptul c variabila $a va recupera caracterul
ters din $a de ctre funcia chop.
n tabelul 4 sunt prezentate cteva exemple de utilizare a
funciei chop.

Tabelul 4 Funcia chop()


Variabile Instruciunea Rezultat
$a = Buna ziua\n; $b = chop($a); $a= Buna ziua
$b = \n
$a = Buna ziua; $b = chop($a); $a = Buna ziu
$b = a
$a = t $b = chop($a); $a =
$b = t
$a = ; $b = chop($a); $a =
$b =
$a = 3.1415; $b = chop($a); $a = 3.141
$b = 5
$a = 1; $b = chop($a); $a =
$b = 1

13
Operatorul chomp()

Operatorul chop() terge ultimul caracter dintr-un ir de


caractere fr a ine cont de valoarea sa, ceea ce poate provoca
diferite erori. n multe cazuri utilizatorul nu cunoate modul n
care a fost creat (citit) irul de caractere i deci nu tie dac el se
termin cu \n sau nu. Adic de fapt noi nu vom dori s tergem
ultimul caracter, dac el nu este \n.
Operatorul chomp() este prevzut pentru a terge
exclusiv numai caracterul \n, dar nu va terge alt ultim caracter. n
tabelul 5 sunt prezentate exemple de utilizare a funciei chomp().

Tabelul 5 Funcia chomp()


Variabile Instruciunea Rezultat
$a = Buna ziua\n; $b = chomp($a); $a= Buna ziua
$b = \n
$a = Buna ziua; $b = chomp($a); $a= Buna ziua
$b =
$a = \n $b = chomp($a); $a =
$b = \n
$a = ; $b = chomp($a); $a =
$b =
$a = 3.1415; $b = chomp($a); $a = 3.1415
$b =
$a = 1; $b = chomp($a); $a = 1
$b =

irurile de caractere ce se conin n fiiere au o


particularitate: liniile ce nu conin caractere vizibile (vide) conin
totui caracterul invizibil \n. Unica linie ce nu conine nici un
caracter este ultima, cea care indic sfritul fiierului prin
Ctrl+Z.
n exemplele urmtoare vom prezenta modul de prelucrare
a liniilor de string din fiiere standarde stdin.

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.

Variabila de intrare predefinit

n cazul n care programul returneaz o valoare fr


destinaie, se va utilza o variabil predefinit cu numele $_
accesibil total utilizatorului.
n consecin, urmtoarele instruciuni pot fi nlocuite cu:
<stdin> $_ = <stdin>;
chop($a); $_ = chop($a);
print; print($_);
Deci programul precedent poate fi rescris n modul
urmtor:
while (<stdin>)
{ print linia contine: ;
print;
}
print Sfarsitul programului\n;

15
Operatori pentru iruri de caractere

1. Operatorul (.) punct. El permite concatenarea


(unirea) a dou iruri, aa cum esteindicat n urmtoarele linii :

Buna . ziua . tuturor = Bunaziuatuturor

Buna ziua . . tuturor = Buna ziua tuturor


2. Operatorul de repetare (x) precedat de o expresie de tip
scalar permite repetarea unui ir de n ori, unde n este valoarea
expresiei date.

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

Interpretatorul Perl convertete automat tipul variabilelor


implicate ntr-o expresie n funcie de operatorul ce le separ.
Astfel dac dou variabile $a i $b care au orice tip sunt
legate cu o operaie aritmetic (+, -, *, /, % etc.) ele vor fi n
mod automat convertite n numere, iar n cazul unei operaii
pentru iruri de exemplu ( . ) vor fi convertite n iruri.

Fie $n1 = 123; $n2 = 456;


$c1 =567; $c2 = 897;
n tabelul 6 sunt prezentate operaii cu date de tip diferit i
rezultatul obinut.

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

Operatorii lt, gt, eq, le, ge, ne compar lexicografic 2


iruri n sensul: nainte de, dup, identic cu, nainte de sau identic,
dup sau identic, non-identice

123 lt 126 are valoarea Adevrat


audi lt auto are valoarea Adevrat
30 lt 126 are valoarea Fals
starter lt start are valoarea Fals
eu eq eu are valoarea Adevrat

Operatorul cmp

Este echivalent cu spaceship, dar se aplic la iruri de


caractere dup cum urmeaz:
$a cmp $b este +1 dac $a urmeaz dup $b
$a cmp $b este 0 dac $a precede $b
$a cmp $b este -1 dac $a este identic cu $b

17
Cteva funcii pentru iruri

$a = lc ($ sir); - convertete ir n minuscule


$a = lcfirst ($ sir); - convertete n minuscule numai primul
caracter al irului
$a = uc ($ sir); - convertete irul n majuscule
$a = ucfirst ($ sir); - convertete numai primul caracter n
majuscule

LISTE

n Perl noiunea de list conine noiunea trivial de tablou


din alte limbaje, dar este mult mai universal.
O list este notat prin @ urmat de nume. Adresarea la
elementele unei liste notate @lista cu elemente scalare va fi
$lista[4] sau $lista [i], numerotarea ncepnd cu zero. Dar
elementele unei liste nu sunt obligatoriu de acelai tip.
O list este reprezentat n mod explicit printr-un ir de
valori situate ntre paranteze i separate prin virgul: (1, Salut,
9.81, Pi);
Iat cum putem iniializa o list
@lista = (1,Salut, 9.81,Pi);
@v = (); o list vid
@a = @b; copie lista b n a
@tab = @lista[$i, $i+1,$i];
Dac i=1 se vor copia n lista tab elementele din lista cu indicii 1,
2 i iar 1, adic vom obine
(Salut, 9.81, Salut)
iar n cazul
@tab=@lista[$i, $i+1, $i, 3] va copia (Salut, 9.81, Salut,Pi)
Ca i n cazul variabilelor scalare exist o variabil
predefinit @_ pentru cazul cnd nu se indic destinaia.

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

Accesul la elementele listei are loc prin intermediul numelui listei


dar cu tipul $ i indicele respectiv :
@lista = (0,1,2,3,);
$b = $lista[1];
$lista[2] += 20;
$b va avea valoarea 1 iar lista va conine elementele (0, 1, 22, 3)
La afiare putem selecta unele elemente din list
print @lista[2,3];
se va afia 22 3.
Inversarea valorilor a dou variabile se va face aa:
@lista[0,2] = @lista[2,0];
Putem nlocui primele 3 elemente:
@lista[0,1,2] = @lista[1,1,1];
Lista va conine (0, 0, 0, 3)
Putem chiar schimba valori numerice cu iruri de
caractere.
@lista = (100,101,102,103);
@lista[2,0] = (AAA , BBB);
La afiare obinem BBB 101 AAA 103.
n continuare o list explicit poate fi indexat
@lista = (100, 101, 102, 103, 104) [0,2,4];
La afiare obinem 100 102 104
Este posibil a indexa o list prin intermediul altei liste
pentru a extrage (forma) a treia list
@lista = (100, 101, 102, 103, 104);
@indice = (0, 2,4);
@tab = @lista[@indice],
La afiare obinem rezultatul precedent 100 102 104
Important! Adugarea elementelor n lista existent se face
n modul urmtor :
@lista = (100, 101, 102, 103, 104);
$lista[5] = 205;
$lista[8] = 404;
20
La afiare obinem 100 101 102 103 104 205 404
Elementele cu indicii 6 i 7 lipsesc i deci au valoarea
undef

Operatorii pentru liste

Operatorii chop( ) si chomp( ) pot fi aplicai i la liste aa cum


este prezentat n exemplul urmtor :
@lista =(100, 101, 102, 103, 104)
For ( $i=0 ; $i<3 ; $i++)
{ @ x=chop( @ lista); $l ung=$#lista+1;
print @lista @x $lung\n } ;
Programul va afia :
10 10 10 10 10 4 5
1 1 1 1 1 0 5
1 5
Operatorul chop( ) va extrage (terge) de la fiecare element al
listei @lista ultimul caracter n ciclul for de 3 ori. In final lista
este vid dar are lungimea 5 elemente undef.
In mod asemntor funcioneaz i chomp( ) utilizat n
programul urmtor
@lista= (abc, xy\n, 234, z/n, Salut );
@ x= chomp(@ lista);
print @lista x=@x \n;
programul va afia:
abc xz 234 z Salut x=2
x=2 este numrul de caractere \n care nimerete n lista @x dup
aplicarea funciei chomp( )
Listele pot fi sortate n ordine cresctoare sau inversate
@ lista=( 4, 1, 12, 11, 2, a, b, B, c);
@ listas= sort (@ lista);
@ listar= reverse(@lista);
print @listas\n @listar\n ;
programil va afia:
1 11 12 2 4 B a b c
c B b a 2 11 12 1 4
21
Instructiunea foreach
Aceast instruciune permite parcurgerea secvenial a
elementelor unei liste.
@lista=( 1, 4, 5, 7, 8, 9);
foreach $i ( @lista )
{ print $i ; }
Programul va afia:
145789
sau
@lista=(1, 4, 5, 7, 8, 9);
foreach $i ( @lista )
{ if ($i % 2) { print $i } };
Programul va afia:
1579
sau
@lista =(1, 2, 3, 4, 5);
foreach $i (reverse (@ list a ))
{ print $i ; };
Programul va afia:
54321
Instruciunea foreach ca i alte instruciuni de ciclu poate
s conin instruciunile next i/sau last. Programul care urmeaz
exemplific utilizarea acestor instruciuni n corpul buclei
foreach.
$k=0;
@lista=( 1, 3, 4, 6, 7, 8, 9);
foreach $i ( @lista )
{
{ $k++;
print "Iteratia k=$k i=$i\n" ;
if ( $i < 4) { next; }
print "Salt\n"
}
if ($i > 7 ) { last; } }

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

Funciile push(), pop(), shift() i unshift()

Aceste funcii permit utilizarea listelor n mod Stiva sau ir de


ateptare.
Funcia push() are doi parametri: primul este o list, iar al
doilea un ir de variabile scalare, care se vor aduga la sfritul
listei, adic la dreapta listei. Funcia pop() are ca parametru o list
din care va fi extras ultimul element din dreapta i atribuit
variabilei din stnga instruciunii de atribuire. Funcia shift() are
i ea un singur parametru ca i pop() numai c va fi extras primul
element din stnga. Funia unshift() este asemntoare cu
push() dar va aduga elementele n stnga listei, adic la
nceputul ei.
n tabelul 7 sunt prezentate mai multe operaii cu liste i
coninutul listei dup fiecare operaie.

Operatorul split

Permite transformarea unui ir de caractere ntr-o list.


Primul argument este criteriul de selectare a elementelor listei
formate, iar al doilea argument este irul dat. n cazul criteriului
/a/ vor fi selectate subirurile mrginite de caracterul a.
Fragmentul care urmeaz utilizeaz acest criteriu.
$sir = Salutare ;
23
@ lista = split ( /a/, $sir ) ;
for ( $i =0 ; $i < $ # lista+1 ; $i ++) { print $lista[ $i ] \n ; };
Programul va afia:
S
lut
are

Tabelul 7 Operaii cu liste


Operaia Coninutul listei
@ lista = (1,2,3); 123
$val = 6; 123
push ( @lista, $val ); 1236
push ( @lista, 7, 8 ); 123678
$val = shift( @lista ); 23678
push ( @lista, $val ); 236781
unshift( @lista, 4, 5 ); 45236781
$ val = pop( @lista ); 4523678

Criteriul de separare poate fi mult mai complicat. De fapt este


vorba de o expresie regular care va fi expus n continuare. n
cazul cnd criteriul de separare este undef adic // atunci fiecare
caracter va fi selectat i considerat ca element al listei formate.
Cu split() putem numra caracterele indicate ntr-un ir dat.
Programul urmtor va calcula i afia numrul de zerouri i uniti
din irul introdus de la tastatur.
$sir = <studin>;
$z = split ( /0/ , sir ) -1;
$u = split( /1/ , sir ) -1;
print Sirul contine $z zerouri si $u unitati \n ;
n cazul introducerii irului :
Numrul 100131 este mai mare fa de 10031
se va afia :
Sirul contine 4 zerouri si 5 unitati.

24
Operatorul join ()

Este dual fa de split(). Acest operator permite formarea


unui ir de caractere din elementele unei liste date.
@ lista = (Programarea, in, Perl);
$sir = join ( , @ lista);
print $sir \n ;
Programul va afia :
ProgramareainPerl

Operatorul qw

Operatorul qw permite crearea unei liste din iruri de


caractere ntr-un mod simplu. n mod trivial iniializarea unei liste
cere utilizarea a mai multor ghilimele sau apostrofuri cum ar fi
cazul instruciunii urmtoare :
@lista = ( Luni, Marti, Miercuri, Joi, Vineri );
Este mult mai raional s utilizm operatorul qw dup cum
urmeaz:
@lista = qw (Luni Marti Miercuri Joi Vineri );
Operatorul qw va extrage din irul dat de caractere fragmente care
au ca elemente separatoare caracterele : spaiu, tabulare sau
Enter. Acelai rezultat se va obine i n cazul expresiei regulate :
@lista = qw /Luni Marti Miercuri Joi Vineri / ;

Sortri complexe

Functia sort() sorteaz implicit n mod cresctor. Prin


apelarea la operatorii < = > i cmp putem realiza i alte moduri de
sortare.
Cu alte cuvinte instruciunea de sortare @ a = sort(@ b) ; poate
fi rescris n modul urmtor @ a = sort { $a cmp $b} @ b ; din
care rezult c pentru sortare n ordine descresctoare vom scrie
@ a = sort { $b cmp $a} @ b ;
25
In cazul sortrii numerelor n ordine cresctoare vom utiliza
instruciunea urmtoare :
@ a = sort { $a < = > $b } @ b; i respectiv pentru sortare n
ordine descesctoare utilizm @ a = sort { $b < = > $a } @ b ;
Fie dat lista iniial @b = ( e, t, 12, a, 105 ); Apelarea
operatorului cmp va permite sortarea elementelor listei date n
ordine cresctoare lexicografic n cazul
@a = sort {$a cmp $b } @b i lista a va conine elementele
aranjate n ordinea urmtoare : 105 12 a e t iar n ordinea
invers vom reui cu instruciunea @a = sort {$b cmp $a } @b.
Remarcm i modul de sortare n ordine cresctoare a listelor
ce conin numere cu instruciunea @a = sort { $a < = > $b } i n
ordine descresctoare cu instruciunea
@a = sort { $b < = > $a };

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 )

n capitolele precedente au fost prezentate i utilizate funcii


predefinite ( print, sort, open, close etc. ). Limbajul Perl ofer
utilizatorului posibilitatea de a scrie i utiliza funcii proprii.
Funciile utilizatorului se numesc subrutine sau subprograme.
Funcia are forma :
sub nume_functie
{
instructiune_1;
instructiune_2;
.......................
instructiune_n;
}
Apelul unei funcii se face prin numele ei nume_functie; n
cazul cnd funcia a fost deja definit mai sus, sau prin
& nume_functie; n alte cazuri.
n programul urmtor funcia este definit mai sus de apelarea
ei.

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

Noiunea de fiier are ca i n majoritatea limbajelor de


programare doua semnificaii. Prima este cea de fiier logic, care
reprezint un parametru al funciilor de manipulare a fiierelor. A
doua semnificaie este cea de fiier fizic, care reprezint o zon pe
discul Winchester unde se pstreaz date ce caracterizeaz un
concept, obiect subiect etc. De fapt este vorba despre oricare fiier
de pe disc. Limbajul Perl dispune de mai muli operatori care
permit testarea parametrilor fiierelor. De obicei valoarea
30
returnat de operator este de tip boolean i deci se utilizeaz cu un
if ca i n forma care urmeaz :
if ( operator ) { print Rezultatul testarii \n ; }
n continuare sunt prezentai civa operatori de testatre a
fiierelor.
- e testeaz dac parametrul su este o cale corect i valabil n
contextul dat. Urmtoarea instruciune Perl verific dac fiierul
fis.pl se pstreaz n catalogul bin din catalogul perl.
if ( -e /perl/bin/fis.pl ) { print Fisierul exista \n ; }
- f testeaz dac parametrul su este un fiier normal;
- r testeaz dac programul are acces la citirea fiierului;
- w testeaz dac programul are acces la nregistrare n fiierul
dat;
- x testeaz dac programul are permis la executarea fiierului dat;
- o testeaz dac fiierul aparine utilizatorului care execut
programul;
- z testeaz dac fiierul este vid;
Lista complet de operatori de testare a fiierelor poate fi
consultat prin intermediul comenzii perldoc f X.
Asupra fiierelor pot fi aplicate mai multe operaii
specifice cum ar fi : deschiderea, nregistrarea, citirea, adugarea,
nchiderea, etc. Orice manipulare cu un fiier cere ca el s fie mai
nti deschis. Deschiderea unui fiier se face cu funcia
open( DESCRIPTOR, EXPRESIE ), unde
DESCRIPTOR este un parametru al funciei open care semnific
numele logic al fiierului i care se leag cu numele fizic al
fisierului, EXPRESIE este un parametru al funciei format din
numele fizic al fiierului precedat de unu sau dou caractere care
semnific modul de deschidere ( regimul) dup cum urmeaz :
< - citire
> - nregistrare ( terge fiierul existent)
>> - adugare
+ < - citire i nregistrare
+ > - citire i nregistrare ( terge fierul existent )
+ >> - citire i adugare

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);

print Iata continutul fisierului creat \n;


open (CITIRE, <colegi.txt)
or die Regret, dar fisierul nu poate fi deschis \n;
32
while (<CITIRE>)
{
print;
}
close (CITIRE);

open (ADAUGARE, >>colegi.txt)


or die Regret, dar fisierul nu poate fi deschis \n;
print Adauga un coleg \n;
$b = <STDIN>;
print ADAUGARE ($b\n);
print Fisierul a fost completat \n;
close (ADAUGARE);

print Iata continutul fisierului modificat \n;


open (CITIRE, <colegi.txt)
or die Regret, dar fisierul nu poate fi deschis \n;
while (<CITIRE>)
{
print;
}
close (CITIRE); print Sfarsitul programului\n;

EXPRESII REGULATE

n acest capitol vom aborda un instrument universal i


foarte puternic de prelucrare a textelor numit expresii regulate.
Denumirea original n englez este regular expression, care n
francez se traduce ca expressions rationnelles, dar a fost
acceptat traducera mot a mot expressions rgulires sau
prescurtat regex. n cadrul acestei lucrri vom utiliza termenul
expresii regulate.
Expresiile regulate permit o prelucrare (manipulare) a
textului foarte complicat i concis. Unele dintre funciile

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

n abloanele expresiilor regulate majoritatea caracterelor


semnific nsi valoarea lor. Cteva caractere au un rol particular
i specific. Iat lista acestor caractere :
\ | ( ) [ ] { } ^ $ * + . ? /
Pentru a le utiliza cu valoarea lor trebuie despecificate prin
caracterul anti-slash ( \ ). Desigur c din aceast list face parte i
caracterul / care delimiteaz ablonul dat. De exemplu expresia
$x =~ m/utm\.md/ este adevrat dac variabila $x conine
irul de caractere utm.md. n continuare vom prezenta rolul
fiecrui caracter n detalii i cu exemple de utilizare.
1. Caracterul . ( punct ) semnific faptul c n aceast
poziie ar putea fi orice caracter ( cu excepia caracterului
\n ). Expresia care urmeaz m/m.m./ va recunoate
toate variabilele care conin un ir de 4 caractere din care
primul fiind litera m urmat de orice caracter, apoi urmat de
alt liter m iar pe ultima poziie poate fi orice caracter,
adic irurile : mama, mami, mimi, mbmb, m%mF,
m5m7, etc.
2. Caracterele [ ] semnific afirmaia : unul din caracterele
prezent n croeturi. Iat de ce modelul m/t[oa]r[ei]/
va recunoate numai 4 iruri de caractere i anume : tare,
tore, tari i tori. Pentru a recunoate irurile utm.md sau
usm.md trebuie s utilizm expresia regular
m/u[st]m\.md/. De ramarcat faptul c dac un
caracter se repet de mai multe ori ntre caracterele [ ] se
produce o redundan i de fapt are acelai efect ca i n
cazul unei singure prezene. Cu alte cuvinte ablonul
[telecerere] este echivalent cu ablonul [telcr]. Este
posibil de definit intervale de caractere ordonate. ablonul
[a-z] va fi n corespondere cu orice liter minuscul din
alfabet, iar modelul [0-9] semnific orice cifr. Modelul [-
~] corespunde unui caracter ASCII imprimabil cu
valoarea codului inferior la 127. Un interval poate fi plasat
36
n interiorul unui model. Astfel expresia regular
m/3245[0-9]7/ va recunoate numerele de telefon n care
penultima cifr nu este important. Dac caracterul -
face parte din intervalul dat el trebuie plasat pe primul sau
ultimul loc pentru a elimina orice ambiguitate aa cum
este artat n intervalul ce urmeaz : [A-Z5-] care
semnific: orice caracter majuscul sau cifra 5 sau
caracterul - . Caracterul ^ ( cciuli ) are un rol
particular n cazul cnd este plasat la nceputul intervalului
i trebuie interpretat ca afirmaia orice caracter cu
excepia celor care urmeat. De exemplu intervalul [^ao]
semnific orice caracter cu excepia caracterelor a i o, iar
modelul [^0-9] va recunoate orice caracter care nu este o
cifr.
3. Caracterele { } poart numele de cuantificatori i se aplic
la abloanele atomice, adic la cele mai mici abloane.
Cuantificatorii se plaseaz dup expresia regular i
semnific numrul de repetri al ablonului dat. n tabelul
8 sunt prezentai cuantificatorii i exemple de utilizare.

Tabelul 8 Operaii cu cuantificatori


Cuantificator Repetare Expresie Cuvinte
regular recunoscute
* Zero sau mai m/a*/ nimic, a, aa,
multe ori aaa...
+ Odat sau mai m/a+/ a, aa, aaa
multe ori
? Zero sau odat m/a?/ nimic sau a
{n} Exact de n ori m/a{ 4 }/ aaaa
{ n ,} Cel puin de n m/a{2 ,}/ aa, aaa, aaaa
ori
{,n} Cel mult de n m/a{, 3}/ nimic, a, aa, aaa
ori
{ n,m} De la n pn la m/a{2 , 5}/ aa, aaa, aaaa,
m ori aaaaa

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

Recunoaterea unui numr zecimal este echivalent cu


prezena n irul analizat pe prima poziie a semnului + sau -
urmat de cel puin o cifr i apoi un punct dup care urmeaz cel
puin o cifr. Expresia regular m/[+-]?\d+\.\d+/ este la prima
vedere cea care ar recunoate un numr zecimal. Dar dac am dori
s considerm opional partea fracionar a numrului am putea
utiliza expresia urmtoare m/[+-]?\d+\ .?\d*/ Problema acestei
expresii este c ea va recunoate un numr n care lipsete una din
prile sale componente, adic fie partea ntreag sau cea
fracionar.
Soluia corect ar fi regruparea abloanelor utilizate care
n cazul dat sunt punctul zecimal i cifrele numrului. Acest lucru
poate fi realizat cu paranteze care formeaz regruparea
elementelor abloanelor. Deci expresia regular corect va avea
forma m/[+-]?\d+(\ .d+)?/
Un alt exemplu de regrupare ar fi expresiile urmtoare
m/miau{3}/ care ar produce un miaunat de lung durat, adic
miauuu iar m/(miau){3}/ va miauna de trei ori , adic
miaumiaumiau.

abloane alternative

n multe situaii este necesar posibilitatea de alegere


dintre mai multe alternative. abloanele alternative sunt realizate
prin intermediul caracterului | . Astfel expresia
m/ Ion|Marcel|Carolina / va recunoate irurile ce conin
prenumele Ion sau Marcel sau Carolina.n cazul expresiei m/
Ion|Marcel|Carolina Scutaru/ se va recunoate Ion, Marcel sau
Carolina Scutaru i nu Ion Scutaru sau Marcel Scutaru.
Recunoaterea ultimei situaii adic a unor persoane cu acelai
nume de familie este posibil prin regrupare i utilizarea expresiei
m/(Ion|Marcel|Carolina) Scutaru/ n cazul cutrii a unor
surori i frai.
39
Marcarea poziiilor n abloane

O marcare a poziiei n expresia regular are scopul de a


indica poziia la care se refer ablonul dat. De exemplu,
caracterul ^ corespunde nceputului unui ir. n aa fel expresia
$v =~ m/^a/ este adevrat, dac variabila $v ncepe cu litera a.
Remarcm faptul c acest caracter ^ are mai multe roluri. n
cazul cnd se afl ntre croeturi va semnifica
complementaritatea, adic orice caracter cu excepia
caracterelor situate dup acest marcator.
Din contra, caracterul $ corespunde afirmaiei
sfritul irului. Expresia $v =~ m/c$/ are valoarea
adevrat dac variabila $v se termin cu caracterul c. Un alt
marcator des utilizat este \b care semnific nceputul sau sfritul
unui ir de caractere.
Expresia m/\btoto\b/ va recunoate irurile n care toto este un
cuvnt separat adic toto, cuvant1 toto, toto cuvant2
sau cuvant1 toto cuvant2 i nici decum irul cuvant1
totoCUVANT2 .

Referine n arier

Regruparea prin intermediul parantezelor se numete cu


memorizare. Adic formula dat se pstreaz n memorie de ctre
motorul de expresii regulate i va putea fi utilizat ulterior. Un
exemplu tipic este situaia n care un text conine un cuvnt, care
se repet de 2 ori. Expresia m/\w+.*\w+/ nu ne satisface, deoarece
va recunoate dou cuvinte care ar putea fi diferite.
Soluia recunoaterii este utilizarea notrilor \1, \2 etc.
care fac referin la subirurile recunoscute de expresiile
regrupate ntre paranteze. De notat faptul c numrul maximal de
referine nu va depi cifra 9.
Rezolvarea problemei anterioare este expresia urmtoare
m/(\w+) .*\1/ n care fragmentul \w+ corespunde unui cuvnt iar
parantezele vor memoriza valoarea gsit.
40
Fragmentul .* nseamn un numr nedefinit de caractere ntre
cuvintele cutate.
n sfrit fragmentul \1 face referin la valoarea gsit de \w+.
Exemplul care urmeaz este tipic n contextul referinelor.
Expresia m/(.+), (.+), \2 I \1 va recunoate un ir de caractere
ce conine un model oarecare urmat de o virgul i un spaiu apoi
va urma un al doilea model urmat i el de o virgul i un spaiu,
apoi se va repeta mai nti al doilea model i pe urm primul, ntre
ele fiind plasat cuvantul I.

Variabile definite

Variabilele speciale $1, $2 etc. sunt accesibile


utilizatorului dup utilizarea unei expresii regulate. Ele corespund
subirurilor dintre paranteze.
Mai exist nc alte 3 variabile, care nu se recomand
pentru utilizare sistematic dar pot fi necesare n unele cazuri.
$& - corespunde irului ablonului dat
$` - corespunde irului care precede ablonul dat
$' corespunde irului care urmeaz dup ablonul dat
Exemplu
m/$v = Eu aaa si ion;
if($v =~ m/(a+) si ([a-z])/)
{ print $1\n;
print $2\n;
print $&\n;
print $` \n;
print $' \n;
}
Programul va afia :
aaa
i
aaa si i
Eu
on
41
Valori returnate de m//

Operatorul de corespundere m// returneaz valoarea


adevrat sau fals n cazul contextului scalar. n contextul listelor
operatorul va returna lista elementelor care corespund ablonului
ntre paranteze (fr limita 9). De exemplu, instruciunea
( $x, $y ) = ( $v =~ m/^(A+).*(B+)$/
va plasa n $x caracterele A de la nceputul irului iar n $y
caracterele B care termin irul dat.

TABELE HASH

Un tabel hash este un tip de date n Perl care permite de a


asocia (lega) o valoare cu o cheie. n tipul de date tablouri (liste)
se leag o valoare scalar cu un ntreg: valoarea elementului i
numrul de ordine.
n tabele hash se merge i mai departe, se va asocia(lega)
o valoare scalar cu orice ir de caractere.
Un exemplu tipic ar fi lista de telefoane ale colegilor de grup:
Ina 079 44 44 44
Dina 069 55 55 55
Ana 069 66 66 66

Prenumele de mai sus reprezint cheile tabelului(adic


puncte de intrare), iar numerele de telefon sunt valori asociate
cheilor . Deci, o cheie va fi prezent o singur dat n tabel, iar o
valoare poate fi legat cu mai multe chei.

Declaraii i utilizare

Un tabel hash se declar n modurile my%h sau my


%h=(); unde se declar o tabel vid. Iniializarea datelor se
poate n modul:
42
my%h=(Ina=>20, Dina=>21);
Accesul la elementele tabelei se face prin cheia respectiv.
$h{ Ina } va avea valoarea 20.
n cazul cnd numele cheii comport semnul sublinierii
sau cifre, numele trebuie scris n apostrofuri sau ghilimele.
Cheia poate fi i o variabil scalar:
$k=Marcela;
$h{$k} =32.33.34;
Dar poate fi o expresie mult mai complicat:
sub f { returnIon; }
$h { f().ela}=49 49 49;
print $h {Ionela}\n;
Programul va afia :
49 49 49
Parcurgerea tabelelor

Exist 3 posibiliti de a parcurge o tabel hash. Se


consider tabelul iniializat n modul urmtor:
my %h=(Ina=>20,Dina =>21,Ana =>22);
1. Funcia keys returneaz lista cheilor.
Este obinuit s se apeleze perechile cheia-valoare cu o bucl
foreach
foreach my $k (keys(%h))
{ printCheia= $k=>Valoarea=$h{$k }\n};
Dup cum se va vedea la afiare ordinea cheilor nu este
garantat.
2. Funcia values returneaz lista valorilor. Iat fragmentul
de program, care va afia valorile tabelei %h
foreach $v(values(%h))
{ print Valoarea=$v\n ;}
Ordinea valorilor afisate va coincide cu cea din exemplul
precedent.
3. Lista cheilor tabelei hash poate fi obinut prin
instruciunile urmtoare pornind de la tabelul %h :
@lista = keys(%h);
print @lista \n;
43
4. Funcia each returneaz pe rnd toate perechile (cheie,
valoare) a tabelului. Funcia are un specific: la urmtoarea
chemare va returna urmtorul cuplu. Pentru a afia toat
lista se recomand:
while (($k, $v) = each(%h))
{ print Cheia=$k Valoarea=$v \n ; }
Tabelul existent poate fi completat cu alte cupluri(adugare)
n modul urmtor :
$h{ Eugen }= 23;
Iar expresia $h{bye}++; creeaz un element cu valoarea 1.
Aceast proprietate poate fi utilizat n cazul cnd se cere
determinarea de cte ori este ntlnit cuvntul n text:
my @text.=qw(eu si tu si iar eu si tu);
my %contor=();
foreach my $cuvant (@text)
{$contor { $cuvant }++; }
while (my ($k, $v)=each(%contor))
{ print Cuvantul '$k'se intilneste de $v ori \n ; }
Va afia:
Cuvantul 'si' se intalneste de 3 ori
Cuvantul 'tu' se intalneste de 2 ori
Cuvantul 'iar' se intalneste de 1 ori
Cuvantul 'eu' se intalneste de 2 ori

Operatorii exists i delete

Operatorul exists returneaz valoarea adevrat dac


elementul exist n tabelul dat cum ar fi de exemplu cazul if
(exists($h{Eugen})) { ... }. La rndul su operatorul delete
terge cheia indicat din tabelul dat. Opratorul
delete($h{ Eugen } ); va terge cheia Eugen din tabelul %h.
Se poate de verificat dac un tabel este vid n modul
urmtor: i f (%h eq ) { print %h este vid \n; }

44
Tabele hash i liste

Sintaxa limbajului Perl permite o trecere lejer de la o list


la tabele hash.
De exemplu:
my @ t=(Ina, 20, Dina, 21, Ana, 22 );
my %h =@ t;
while ( ($k, $v) = each(%h) )
{ print $k $v\n ; }
Va afia:
Dina 21
Ana 22
Ina 20

Desigur este posibil i operaia invers: transformarea


unui tabel hash n list cu ajutorul instruciunii my @tab =
%h;
Funcia reverse aplicat la tabele hash provoac
urmtorul efect : valorile devin chei i invers: cheile devin
valori.

45
Bibliografie

1. Wyke, Dthomas Perl. Bucuresti: Teora 2005


2. Larry Wall Learning Perl. OReilly 2001
www.perl.com
www.perl.org
www.pams.pw
www.oreilly.com
www.cpan.org
www.pw.org
www.perlmonks.org
www.learn.perl.org
www.theperlreview.com
www.paris.mongvevrs.net
www.perl.enstimac.fr
www.regex.ro

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

S-ar putea să vă placă și