Lucrarea 1

Lucrarea 1

Intro

Limbajul Perl este un limbaj de programare de nivel înalt, interpretat, inițial dezvoltat de Larry Wall în 1987. Limbajul Perl a fost dezvoltat pentru prelucrarea de texte și generarea de rapoarte, de aici acronimul: Practical Extraction and Report Language. Limbajul împrumută caracteristici ale limbajelor C, Pascal, AWK, sed, sh și chiar BASIC. Perl este un limbaj portabil, rulând în peste 100 de platforme de la sisteme portabile la sisteme distribuite.

Perl a fost folosit de la începuturile Web-ului în programarea dinamică a site-urilor utilizând protocolul CGI. Pe lângă Python și PHP, Perl este unul dintre cele mai populare limbaje folosite în dezvoltarea site-urilor dinamice. Site-uri populare ca imdb.com, bbc.co.uk, amazon.com, booking.com sau dslreports.com au fost realizate cu ajutorul perl-ului sau mod_perl-ului.

Pe sistemele UNIX limbajul Perl este de obicei preinstalat deoarece numeroase componente Linux/Unix sunt implementate folosind Perl.

Pentru sistemele Microsoft Windows, interpretorul Perl poate fi obţinut de pe site-ul http://www.activestate.com sau http://strawberryperl.com/. De asemenea, Activestate pune la dispoziţie şi un mediu integrat de dezvoltare (IDE) sub numele de Komodo, disponibil şi în variantă gratis.

Un simplu program Perl arata astfel:

print "Hello Kitty !\n";

Observatie: Limbajul Perl este un limbaj case-sensitive.

De obicei programele sunt salvate în fișiere cu extensia .pl. Rularea programului făcându-se cu ajutorul interpretorului Perl astfel:

>perl hello_world.pl

Perl dispune de o documentaţie bogată, comanda perldoc oferind acces la tutoriale, definiţii şi sintaxe ale funcţiilor de bază. Această documentaţie poate fi consultată şi online accesând: http://perldoc.perl.org.

Exemple de accesare a documentaţiei din consolă (terminal):

>perldoc perl - pagina principală de documentaţie

>perldoc perltoc - cuprinsul documentaţiei perl

>perldoc -f print - documentaţia pentru funcţia print ( -f de la function :))

Structura unui program in perl.

Un program perl începe de obicei cu includerea unor module sau unor optiuni de interpretare. Pentru ca interpretorul sa afiseze mesajele "warning" la intepretare se va utiliza directiva "use warnings;" la inceputul fiecarui fisier sursa.

Comentariile in perl incep cu "#". Pe orice linie, orice caracter dupa caracterul # este considerat comentariu. Pentru a comenta un bloc de cod, se va utiliza combinatia "=pod / =cut". Interpretorul perl considera ca linia care contine doar "=pod" marcheaza inceputul unei documentatii (comentariu) si linia care contine "=cut" marcheaza sfarsitul aceste zone de documentatie. Astfel, exemplul de mai sus devine:

# linia urmatoare spune interpretorului sa afiseze

# mesaje de atentionare

use warnings;

print "Hello World.\n";

=pod

comentarii

documentatie

etc.

=cut

print 'Hello World\n', "\n";

Blocurile de cod în perl sunt delimitate ca în C, utilizând {}.

{ print "Acesta este"; $p = $p + 1; print " un bloc de cod.\n"; }

Tipuri de date

Perl dispune de trei tipuri de date fundamentale: scalar, array şi hash.

($) Scalarii pot conţine o singură valoare. Această valoare poate fi un întreg, un real, un caracter, un string sau o referinţă. Numele variabilelor scalare încep întotdeauna cu caracterul $.

$nume = "Petru"; $adresa = "str. Paltinis nr. 4"; $varsta = 21; $medie = 9.7;

print "Medie: ", $nume, " Medie: ", $medie, "\n";

Mail multe despre scalari: http://perldoc.perl.org/perldata.html

(@) Array-urile sunt colectii organizate de valori scalare, ele stochează liste de scalari. Numele unei variabile array începe întotdeauna cu caracterul @. Indexul de pornire într-un array este 0, la fel ca în limbajul C. Dimensiunea unui array în perl este limitată doar de memoria de care dispune sistemul pe care rulează interpretorul.

Atentie !,

cand se va face referire la un element dintr-un array

se va utiliza caracterul $: @numbers = (1,2,3,4); print $numbers[2];

@elevi = ("Petru", "Carmen", "Marius"); @colectie = ("Petru", 9.7, "Carmen", 8, "Marius", "Angela", 'c'); print $elevi[0]; #primul element din lista @elevi. print $elevi[-1]; #ultimul element din lista elevi. print scalar(@elevi); #numarul de elemente print $#elevi; #indexul maxim dintr-o lista (scalar(@elevi)-1)

Două dintre cele mai importante funcții care lucrează cu liste (sau array-uri): split și join

# lipeste elementele listei intr-un string my $string = join(" - sheep - ", (1,2,3,4,5,6));

# desparte un string, retureaza o lista my @array = split(" - sheep - ", $string);

print "$string\n"; print "@array\n";

(%)Hash-urile (sau listele asociative) conţin o colecţie neordonată de perechi cheie/valoare. Numele variabilelor hash începe întotdeauna cu caracterul %. Cheile sunt întotdeauna valori scalare unice, valorile pot fi orice valoare scalară. La fel ca pentru array-uri, dimensiunea unui hash este limitată doar de memoria de care dispune sistemul pe care rulează interpretorul.

%situatie = ("Petru", 9.7, "Amalia", 9.8, "Dan", 9); %situatie = ( "Petru" => 9.7, "Amalia" => 9.8, "Dan" => 9 ); print $situatie{"Dan"}; # valoarea pentru cheia Dan

print keys(%situatie); print values(%situatie);

($cheie, $valoare) = each %situatie; # returneaza o pereche cheie-valoare din hash # mutand cursorul in hash pe pozitia urmatoare.

Variable speciale in Perl (doar câteva ;)) http://perldoc.perl.org/perlvar.html

@ARGV - lista parametrilor din linia de comandă

@INC - lista directoarelor din care Perl încarcă module

%ENV - lista variabilelor de sistem

$0 - numele scriptului aflat în execuție

$! - ultima eroare de la sistemul de operare

$_ - variabila implicită

$, - un string care separă elementele unei liste la tipărirea neinterpolată

$" - un string care separă elementele unei liste la tipărirea interpolată

print "Running: $0\n"; $" = ", ";

$, = "; ";

print "@ARGV\n";

print @ARGV,"\n";

Lucrul cu scalari

Perl suportă scrierea numerelor în mai multe baze de numeraţie: decimal, binar, octal sau hexadecimal.

use warnings; print 255,"\n"; # decimal print 0377,"\n"; # octal print 0b11111111,"\n"; # binar print 0xFF,"\n"; #hexa

În perl există doua tipuri de string-uri. Diferenţa dintre ele este modul în care interpretorul evaluează aceste string-uri:

  • string-urile "single quoted" sunt stringuri care nu suportă interpolare. Mai exact, interpretorul nu va ţine cont de caracterele de control aflate în aceste string-uri sau de numele de variabile, el va afişa aceste string-uri exact aşa cum sunt scrise în codul sursă.
  • string-urile "double quoted" suportă interpolare iar caracterele de control şi numele variabilelor vor fi înlocuite de către interpretor de tab-uri sau caractere linie nouă, etc. respectiv valorile variabilelor ale căror nume apar în string-uri.

use warnings; $a = 12; print 'Valoarea lui $a '; $a = $a + 2; print "este $a\n"; print 'Linia 1\n$a\nLinia 2\n'; print "Linia 1\n$a\nLinia 2\n";

$nume = 'GEORGESCU'; $prenume = 'Dan'; $salut = "Hello $prenume $nume"; print "$salut";

Pentru citirea variabilelor de la tastatură, in perl se va folosi stream-ul de intrare STDIN astfel:

$a = <STDIN>; print "S-a citit $a de la tastatura.\n";

Observaţie:

Orice variabilă citită de la tastatură va conţine la sfârşit caracterul "\n". Daca valorile citite se folosesc in context numeric, interpretorul perl

va ignora automat caracterul "\n" de la capatul numerelor dar in cazul sirurilor de caractere, acest caracter se pastreaza si poate deranja afisarea corecta a datelor. Pentru a indeparta acest caracter se va folosi functia chomp.

use warnings; $nume = <STDIN>; print "Elevul $nume a intrat in clasa.\n"; chomp($nume); print "Elevul $nume a intrat in clasa.\n"; # pentru documentatia functiei chomp folositi comanda: # perldoc -f chomp intr-un terminal.

Exemple de expresii condiţionale

if (EXPR) BLOCCOD
if (EXPR) BLOCCOD else BLOCCOD
if (EXPR) BLOCCOD elsif (EXPR) BLOCCOD ...
if (EXPR) BLOCCOD elsif (EXPR) BLOCCOD ... else BLOCCOD
INSTRUCTIUNE if (EXPR)

BLOCCOD este o grupare de instrucţiuni aşa cum s-a aratat mai sus:

{ print "This is a string\n"; $a += 34; chomp($citire); }

Primul exemplu arată o formă destul de comună de utilizare a expresiei IF. Spre deosebire de limbajul C, în limbajul Perl scrierea acoladelor este obligatorie, chiar dacă după condiţie urmează o singură instrucţiune.

if ($a == $b) { print "Egalitate"; }

Exemplul următor prezintă o formă cu mai multe condiţii în acelaşi bloc condiţional. Se observă utilizarea mai multor cuvinte cheie elsif(EXPR) urmate de blocul else. Această formă este foarte asemănătoare cu instrucţiunea switch din C.

if ($a < 0) { print "Negativ\n"; } elsif ($a == 0) { print "Nul\n"; } elsif ($a =~ m/[a-z]/i) { print "String\n"; } else { print "Pozitiv\n"; }

Pentru cazul în care după testarea expresiei urmează o singură instrucţiune se poate utiliza forma inversă a expresiei IF:

print "BLA\n" if (!$a);