Procedury


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


Parametry

V predchozim pripade jsou parametry akceptovany procedurou, ale nejsou nikde v procedure vyuzity. Pri volani procedury jsou parametry predany do procedury jako seznam ve specialni promenne @_. Promenna @_ je bezne pole. Tato promenna nema nic spolecneho se skalarni promennou $_.

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 $_.


Predani hodnot z procedury

Procedura predava vysledek. Vysledek je hodnota posledniho vykonaneho prikazu, muze to byt pole nebo skalar.

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.

Lokalni promenne

Promenna @_ je lokalni promennou dane procedury, stejne tak promenne $_[0], $_[1], $_[2],.... Je mozne definovat dalsi lokalni promenne. Definovani lokalnich promennych je vyhodne, pokud chceme modifikovat vstupni paramentry. Nasledujici procedura hleda v retezci podretezec.
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]);

Dalsi kapitola | Predchozi kapitola kapitola | Obsah