Programare Programare Perl Perl -...

40
Programare Programare Perl Perl Sabin Sabin - - Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busaco www.infoiasi.ro/~busaco / / 1 1 Programare Programare Perl Perl Introducere Introducere Sabin-Corneliu Buraga Facultatea de Informatica, UAIC, Romania http://www.infoiasi.ro/~busaco/

Transcript of Programare Programare Perl Perl -...

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

î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

ProgramareProgramare PerlPerl

SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 4040

RezumatRezumat•

Caracterizare

a limbajului

Perl

Manualul

Perl on-line•

Primul

program Perl

Sintaxa•

Tipuri

de date

Operatori•

Instructiuni