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

PEGASNETPEGASNET

PEGASNETPEGASNET

PEGASNETPEGASNET

PEGASNETPEGASNET