Jako ka₧d² dobr² programovacφ jazyk umo₧≥uje u₧ivateli i Perl definovat svΘ vlastnφ funkce, kterΘ naz²vßme procedury. Procedury mohou b²t umφst∞nΘ kdekoli v programu, ale z hlediska p°ehlednosti je v²hodnΘ umφstit vÜechny procedury na konec nebo na zaΦßtek programu. P°φklad procedury:
sub vypis { print "Uplne jednoducha subroutina,\n"; print "ktera pise stale to same\n"; }Do procedury m∙₧eme p°edßvat parametry. Volßnφ procedury je mo₧nΘ nßsledujφcφmi °ßdky. VÜimn∞te si, ₧e je procedura volanß pouze jmΘnem procedury, p°ed kterΘ je p°idßn znak &:
&vypis; # volßnφ procedury bez parametr∙ &vypis($_); # volßnφ s parametrem &vypis(1+2, $_); # volßnφ procedury s dv∞ma parametry
Nßsledujφcφ procedura tiskne seznam, kter² byl do nφ p°edßn pomocφ parametru. Nßsledujφ p°φklady volßnφ procedury.
sub printargs { print "@_\n"; } &printargs("kral", "kralovna"); # p°φklad tiskne "kral kralovna" &printargs("ryby", "a", "raci"); # tiskne "ryby a raci"JednotlivΘ prvky pole @_ jsou p°φstupnΘ pomocφ indexu v hranat²ch zßvorkßch:
sub printfirsttwo { print "Prvnφ parametr je $_[0]\n"; print "a $_[1] je druh² parametr\n"; }Op∞t p°ipome≥me, ₧e prom∞nnΘ $_[0] a $_[1] nemajφ nic spoleΦnΘho s prom∞nnou $_.
P°φklad uvßdφ proceduru, kterß vracφ maximßlnφ hodnotu ze dvou vstupnφch parametr∙.
sub maximum { if ($_[0] > $_[1]) { $_[0]; } else { $_[1]; } } $biggest = &maximum(37, 24); # Nynφ $biggest je 37Procedura &printfirsttwo uvedenß v²Üe takΘ vracφ hodnotu, v tomto p°φpad∞ 1. Poslednφ p°φkaz procedury byl p°φkaz print, kter² p°i ·sp∞ÜnΘm provedenφ vracφ hodnotu 1.
Druhß mo₧nost vrßcenφ v²sledku z procedury je pou₧itφ p°φkazu return.
P°φklad: procedura MAX zjiÜ¥uje maximßlnφ hodnotu ze vstupnφch hodnot
sub MAX { $max = pop(@_); foreach $a (@_) { if ($max < $a) { $max=$a; } } return($max); } $maximum = &MAX (12,22,7); print $maximum;Pokud je procedura volanß ve skalßrnφm kontextu, je hodnota vrßcenß p°φkazem return vyhodnocena ve skalßrnφm kontextu. Kdy₧ je procedura volanß v kontextu pole, je vrßcenß hodnota vyhodnocena v kontextu pole. Typy vrßcenΘ hodnoty je mo₧nΘ testovat funkcφ wantarray. Pro kontext pole vracφ funkce wantarray hodnotu true.
sub inside { local($a, $b); # vytvß°φ lokßlnφ prom∞nnΘ ($a, $b) = ($_[0], $_[1]); # p°i°azuje hodnoty $a =~ s/ //g; # odstra≥uje mezery $b =~ s/ //g; # v lokßlnφch prom∞nn²ch ($a =~ /$b/ || $b =~ /$a/); # je $b v $a # nebo $a v $b? } &inside("lemon", "dole money"); # trueProceduru je mo₧nΘ upravit tak, ₧e nahradφme prvnφ dv∞ °ßdky °ßdkou
local($a, $b) = ($_[0], $_[1]);