# sub NAME BLOCK # Etape comparative de realizare și de optimizare a unei subrutine =pod use constant LUNGIME => 60; print "=" x LUNGIME, "\n"; print "-oOo-" x 12, "\n"; print "-" x 50, "\n"; print ">>==<<==" x 8, "\n"; =cut =pod use constant LUNGIME => 60; sub deseneaza { print "-" x LUNGIME, "\n"; } deseneaza; deseneaza; =cut =pod use constant LUNGIME => 60; sub deseneaza { print $_[0] x $_[1], "\n"; } print "Introduceti modelul de desen: "; $model = ; chomp($model); print "\n","De cate ori trebuie afisat modelul: "; $lungime = ; chomp($lungime); deseneaza ($model, $lungime); =cut =pod use constant LUNGIME => 50; sub deseneaza { $caracter = shift || "-"; $contor = shift || LUNGIME; print $caracter x $contor, "\n"; } print "Introduceti modelul de desen: "; $model = ; chomp($model); print "\n","De cate ori trebuie afisat modelul: "; $lungime = ; chomp($lungime); deseneaza ($model, $lungime); =cut =pod # 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; sub deseneaza { %argumente = @_; $caracter = $argumente{Model} || "-"; $contor = $argumente{Contor} || LUNGIME; print $caracter x $contor, "\n"; } print "Introduceti modelul de desen: "; $model = ; chomp($model); print "\n","De cate ori trebuie afisat modelul: "; $lungime = ; chomp($lungime); print "Rezultatul subrutinei deseneaza este:\n"; deseneaza (Model => $model, Contor => $lungime); print "\n"; print "Atentie la rezultatul executiei urmatoarei instructiuni:\n"; print 'print "WWW", deseneaza (Model => $model, Contor => $lungime), "==";',"\n"; print "WWW", deseneaza (Model => $model, Contor => $lungime), "=="; # 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 use constant LUNGIME => 50; sub deseneaza { %argumente = @_; $caracter = $argumente{Model} || "-"; $contor = $argumente {Contor} || LUNGIME; return($caracter x $contor); } print "Introduceti modelul de desen: "; $model = ; chomp($model); print "\n","De cate ori trebuie afisat modelul: "; $lungime = ; chomp($lungime); # Î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 => $model, Contor => $lungime), "=="; $rezultat = deseneaza (Model => $model, Contor => $lungime); print "WWW $rezultat =="; #=cut