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 37
Procedura &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"); # true
Proceduru je mozne upravit tak, ze nahradime prvni dve radky radkou
local($a, $b) = ($_[0], $_[1]);