Procedury


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


Parametry

V předchozím případě jsou parametry akceptovány procedurou, ale nejsou nikde v proceduře využity. Při volání procedury jsou parametry předány do procedury jako seznam ve speciální proměnné @_. Proměnná @_ je běžné pole. Tato proměnná nemá nic společného se skalární proměnnou $_.

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ředání hodnot z procedury

Procedura předává výsledek. Výsledek je hodnota posledního vykonaného příkazu, může to být pole nebo skalár.

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.

Lokální proměnné

Proměnná @_ je lokální proměnnou dané procedury, stejně tak proměnné $_[0], $_[1], $_[2],.... Je možné definovat další lokální proměnné. Definování lokálních proměnných je výhodné, pokud chceme modifikovat vstupní paramentry. Následující procedura hledá v řetězci podřetězec.
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]);

Další kapitola | Předchozí kapitola kapitola | Obsah