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]);