use strict; use warnings; # sub NAME BLOCK # Etape comparative de realizare și de optimizare a unei subrutine, # de la un simplu cod la încapsulare și evitarea problemelor de vizibilitate. # Exemplele indicate trebuie activate pe rând și rulate separat. =pod # EXEMPLUL 1 use constant LUNGIME => 60; print "=" x LUNGIME, "\n"; print "-oOo-" x 12, "\n"; print "-" x 50, "\n"; print ">>==<<==" x 8, "\n"; =cut =pod # EXEMPLUL 2 use constant LUNGIME => 60; sub deseneaza { print "-" x LUNGIME, "\n"; } deseneaza; deseneaza; =cut =pod # EXEMPLUL 3 use constant LUNGIME => 60; my $caractere = ''; my $decateori = ''; sub deseneaza { my ($caractere, $decateori) = @_; # $caractere = $_[0]; # $decateori = $_[1]; print $caractere x $decateori,"\n"; } print "Introduceti modelul de desen: "; $caractere = ; chomp($caractere); print "\n","De cate ori trebuie afisat modelul: "; $decateori = ; chomp($decateori); deseneaza ($caractere, $decateori); =cut =pod # EXEMPLUL 4 use constant LUNGIME => 50; my $caractere = ''; my $decateori = ''; sub deseneaza { my $caractere = shift || "-"; my $decateori = shift || LUNGIME; print $caractere x $decateori, "\n"; } print "Introduceti modelul de desen: "; $caractere = ; chomp($caractere); print "\n","De cate ori trebuie afisat modelul: "; $decateori = ; chomp($decateori); deseneaza ($caractere, $decateori); =cut =pod # EXEMPLUL 5 # Acest exemplu este similar cu cel descris anterior, # doar că, parametrii sunt transferați prin intermediul # unei variabile de tip %hash. use constant LUNGIME => 50; my $caractere = ''; my $decateori = ''; sub deseneaza { my %argumente = @_; my $caractere = $argumente{Model} || "-"; my $decateori = $argumente{Contor} || LUNGIME; print $caractere x $decateori, "\n"; } print "Introduceti modelul de desen: "; $caractere = ; chomp($caractere); print "\n","De cate ori trebuie afisat modelul: "; $decateori = ; chomp($decateori); print "Rezultatul subrutinei deseneaza este:\n"; deseneaza (Model => $caractere, Contor => $decateori); print "\n"; print "Atentie la rezultatul executiei urmatoarei instructiuni:\n"; print 'print "WWW", deseneaza (Model => $caractere, Contor => $decateori), "==";',"\n"; print "WWW", deseneaza (Model => $caractere, Contor => $decateori), "=="; # După cum se observă, atunci când se apelează subrutina "deseneaza" din # interiorul altei funcții, în cazul de față fiind funcția print, apare o problemă legată # de execuția funcției print (cea din deseneaza) în interiorul altei funcții print, # cea din care este apelată subrutina. # De aceea, când apare necesitatea apelării subrutinei din interiorul # altei funcții, trebuie folosită functia return. Vezi ex. urmator: =cut #=pod # EXEMPLUL 6 use constant LUNGIME => 50; my $caractere = ''; my $decateori = ''; my $rezultat = ''; sub deseneaza { my %argumente = @_; my $caractere = $argumente{Model} || "-"; my $decateori = $argumente{Contor} || LUNGIME; return($caractere x $decateori); } print "Introduceti modelul de desen: "; $caractere = ; chomp($caractere); print "\n","De cate ori trebuie afisat modelul: "; $decateori = ; chomp($decateori); # În această situatie subrutina "deseneaza", ca să-și manifeste efectul, # trebuie apelată prin intermediul unei funcții, în cazul de față, # funcția print care apare o singură dată. print "\n"; print "Rezultatul executiei aceleasi instructiuni:\n"; #print "WWW", deseneaza (Model => $caractere, Contor => $decateori), "=="; $rezultat = deseneaza (Model => $caractere, Contor => $decateori); print "WWW $rezultat =="; =cut # De precizat că, ultimul exemplu (6), în care s-a optimizat subrutina se poate # adapta și la exemplul 3 sau 4, exemple care nu folosesc o variabilă %hash # în scopul preluării parametrilor. Aceste variante sunt de preferat datorită # simplității și mai ales a vitezei de execuție deoarece nu se mai pierde timp cu # transferul parametrilor de la @_ la %hash, se pot folosi direct valorile cu # care deja s-a inițializat @_ .