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 37
Procedura &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"); # true
Proceduru je možné upravit tak, že nahradíme první dvě řádky řádkou
local($a, $b) = ($_[0], $_[1]);