Lucrarea 3

Lucrarea 3

Definire:

Perl permite definirea de subrutine, pentru o mai buna organizare a codului, implicit pentru a putea dezvolta proiecte de dimensiuni mai mari.

Sintaxa utilizata:

sub NUME-SUBRUTINA { bloc cod }

Unde NUME-SUBRUTINA e numele subrutinei, iar bloc e o secventa cod delimitata de acolade {...}. Prin conventie numele rutinelor definite de utilizator sunt scrise cu litere mici.

Exemplu de subrutina, inclusiv mod de apelare:

hello(); #apel

sub hello

{

print "Hello from sub.\n";

}

In general subrutinele pot fi apelate oriunde in cadrul unui script Perl, indiferent daca subrutina a fost definita sau nu la momentul apelului. O conventie des utilizata e ca subrutinele sa fie definite la finalul scriptului(vezi ex de mai sus).

In anumite situatii e necesar ca subrutinele sa fie declarate in momentul apelului. In acest caz fie se defineste subrutina inainte de momentul apelului, fie doar este declarata urmand ca implementarea ei sa fie facuta ulterior.

use strict;

#prototip

sub hello;

#apel

print hello;

sub hello {

return "Hello\n";

}

Transmiterea parametrilor:

Se realizeaza in mod facil, valorile parametrilor sunt transmise si respectiv obtinute de la o subrutina ca o lista de valori scalare. Aceste valori pot fi referentiate in cadrul subrutinei prin intermediul unui sir special notat cu @_.

Atentie: Tabloul special @_ este folosit în PERL pentru a transmite lista de parametri către funcţie.

hello_to("Ana", "Dan");

sub hello_to

{

foreach (@_) { print "Hello $_!\n"; }

}

Parametrii transmişi subrutinei: ("Ana","Dan") vor fi automat introduşi in sirul @_. In cazul in care dorim sa avem un nume asociat parametrilor locali putem folosi functiei shift. Shift opereaza asupra array-ului primit ca parametru, iar daca nu primeste ca si argument un array atunci va opera asupra lui @_.

my ($sum, $dif) = add_dif(9,5);

print "Sum:$sum Dif: $dif\n";

sub add_dif

{

#my declara variabilele local

my $a = shift;

my $b = shift;

return $a+$b, $a-$b;

}

Toate subrutinele intorc o valoare, implicit intorc valoarea ultimei expresii evaluate in subrutina, sau o lista vida daca subrutina nu contine declaratii.

Atentie: în cazul în care se omite (sau lipsește) apelul return la ieșirea din funcție se va returna ultima valoare întalnita în functie.

Ex:

sub {

print "Hello Sub";

}

Aici valoarea returnată este 1 deoarece funcția print returnează 1 la "tipărirea cu succes".

Apelul subrutinelor:

Pot lipsi parantezele (), iar la ultimul apel se poate observa ca apelul sea poate realiza si prin trasnmiterea unei referinte catre subrutina.

sub hello_to

{

my $name=shift;

print "Hello $name!\n";

}

hello_to("B624");

hello_to "B624";

&hello_to("B624");

Referinte. Struncturi de date complexe (http://perldoc.perl.org/perlref.html)

O referinta poate fi privita ca si un pointer ce indica catre o structura. Structura poate fi un scalar, sir, hash sau chiar o subrutina.In Perl referintele sunt de doua tipuri simbolice si hard. O referinta simbolica este un nume asociat unei variabile, nume ce este folosit la runtime pentru adresarea variabilei. Referintele hard tin cont de numarul de referinte asociate unei variabile. Pe baza acestui mecanism se realizeaza si eliberarea automata a resurselor(mermoriei) asociate unei variabile. In cazul referintelor hard ce indica catre un sir sau hash, e necesara dereferentierea in mod exlicit.

Atentie:

Crearea unei referinte la o variabila se face cu ajutorul operatorului backslash \

Scalar:

#scalar

$scalar = 10;

$refscalar = \$scalar;

print $refscalar;

################

#dereferentiere#

################

print $$refscalar;

Lista:

#tablou

$pointer = \@ARGV;

$i = scalar(@$pointer);

print "Numarul de argumente: $i";

$i=0;

foreach (@$pointer){

################

#dereferentiere#

################

print "$i : $$pointer[$i++] ($pointer->[$i]) \n";

}

Hash:

#hash

%weekday = (

'01' => 'Luni',

'02' => 'Marti',

'03' => 'Miercuri',

'04' => 'Joi',

'05' => 'Vineri',

'06' => 'Sambata',

'07' => 'Duminica',

);

$pointer = \%weekday;

$i='01';

################

#dereferentiere#

################

print "Ziua: $$pointer{$i} \n";

print "Ziua: ${$pointer}{$i} \n";

print "Ziua: $pointer->{$i}\n";