Jako kazdy dobry programovaci jazyk umoznuje uzivateli i Perl definovat sve vlastni funkce, ktere nazyvame procedury. Procedury mohou byt umistene kdekoli v programu, ale z hlediska prehlednosti je vyhodne umistit vsechny procedury na konec nebo na zacatek programu. Priklad procedury:
sub vypis { print "Uplne jednoducha subroutina,\n"; print "ktera pise stale to same\n"; }Do procedury muzeme predavat parametry. Volani procedury je mozne nasledujicimi radky. Vsimnete si, ze je procedura volana pouze jmenem procedury, pred ktere je pridan znak &:
&vypis; # volani procedury bez parametru &vypis($_); # volani s parametrem &vypis(1+2, $_); # volani procedury s dvema parametry
Nasledujici procedura tiskne seznam, ktery byl do ni predan pomoci parametru. Nasleduji priklady volani procedury.
sub printargs { print "@_\n"; } &printargs("kral", "kralovna"); # priklad tiskne "kral kralovna" &printargs("ryby", "a", "raci"); # tiskne "ryby a raci"Jednotlive prvky pole @_ jsou pristupne pomoci indexu v hranatych zavorkach:
sub printfirsttwo { print "Prvni parametr je $_[0]\n"; print "a $_[1] je druhy parametr\n"; }Opet pripomenme, ze promenne $_[0] a $_[1] nemaji nic spolecneho s promennou $_.
Priklad uvadi proceduru, ktera vraci maximalni hodnotu ze dvou vstupnich parametru.
sub maximum { if ($_[0] > $_[1]) { $_[0]; } else { $_[1]; } } $biggest = &maximum(37, 24); # Nyni $biggest je 37Procedura &printfirsttwo uvedena vyse take vraci hodnotu, v tomto pripade 1. Posledni prikaz procedury byl prikaz print, ktery pri uspesnem provedeni vraci hodnotu 1.
Druha moznost vraceni vysledku z procedury je pouziti prikazu return.
Priklad: procedura MAX zjistuje maximalni hodnotu ze vstupnich hodnot
sub MAX { $max = pop(@_); foreach $a (@_) { if ($max < $a) { $max=$a; } } return($max); } $maximum = &MAX (12,22,7); print $maximum;Pokud je procedura volana ve skalarnim kontextu, je hodnota vracena prikazem return vyhodnocena ve skalarnim kontextu. Kdyz je procedura volana v kontextu pole, je vracena hodnota vyhodnocena v kontextu pole. Typy vracene hodnoty je mozne testovat funkci wantarray. Pro kontext pole vraci funkce wantarray hodnotu true.
sub inside { local($a, $b); # vytvari lokalni promenne ($a, $b) = ($_[0], $_[1]); # prirazuje hodnoty $a =~ s/ //g; # odstranuje mezery $b =~ s/ //g; # v lokalnich promennych ($a =~ /$b/ || $b =~ /$a/); # je $b v $a # nebo $a v $b? } &inside("lemon", "dole money"); # trueProceduru je mozne upravit tak, ze nahradime prvni dve radky radkou
local($a, $b) = ($_[0], $_[1]);