Ocenite etot tekst:


Dlya primeneniya podprogrammy ee neobhodimo opredelit' libo v tekshchem module
(fajle) libo vo vneshnem module (fajle).
Podprogrammy opredelyayutsya i deklariruyutsya sleduyushchim obrazom:

	sub imya;	# Tol'ko deklaraciya. Opredelenie nizhe.

	sub imya (prototipy);  To zhe no s deklaraciej parametrov.

	sub imya blok;	# Deklaraciya i opredelenie.

	sub imya (prototipy) blok; # To zhe, no s parammetrami.

Dlya opredeleniya dinamichskoj anonimnoj podprogrammy mozhno ukazat':

	$peremennaya = sub blok;

Dlya importirovaniya podprogramm iz drugih modulej ispol'zujte:

	use modul' qw(podprogramma1 podprogramma2 );

Vyzov podprogrammy:

	imya(spisok parametrov);	# simvol '&' mozhno ne ukazyvat'.

	imya spisok;	# Esli podprogrmma uzhe deklarirovana.

	&imya;		# Parametry v @_

Vse parametry peredayutsya podprogramme kak massiv @_.
Sootvetsvenno $_[0] - pervyj parametr, $_[1] - vtoroj i t.d.
Massiv @_ - lokal'nyj, no on soderzhit adresa parametrov poetomu
mozhno izmenyat' znachenie parametrov.
Vozvrashchaemoe znachenie podprogrammy - rezul'tat poslednego operatora.
|to mozhet byt' kak skalyar tak i massiv. Mozhno prinuditel'no vozvrashchat'
rezul'tat ispol'zuya funkciyu return().

Podprogrammu mozhno vyzvat' ispol'zuya prefiks '&' pered imenem
podprogrammy. Esli podprogramma predvaritel'no prodeklarirovana to
prefiks i skobki mozhno opustit'.



Dlya primeneniya peremennyh dostupnyh tol'ko vnutri bloka ili podprogrammy
neobhodimo opredelit' ih s pomoshch'yu funkcii my(spisok).

Esli peremennaya odna to skobki mozhno opustit'.

my() deklariruet private peremennye v predelah tekushchej podprogrammy,
bloka, funkcii eval() ili do/require/use fajlov. Private peremennye
analogichny auto peremennym v S.

Primer:

	# Programma vychisleniya faktoriala.

	print fact(3);  # vychislit' faktorial 3*2*1

	sub fact	# Opredelyaem podprogrammu.
	{ my $m;                # private peremennaya no ne local !
	$m = $_[0];
	return 1 if $m <= 1;
	return($m * fact($m -1));
	}

Mozhno ukazyvat' nachal'nye znacheniya private peremennyh kak:

	my(spisok) = vyrazhenie;

Tak dlya vysheprivedennogo primera luchshe bylo napisat':

	my($m) = $_[0];


Peremennye tipa local.

V obshchem luchshe ispol'zovat' private peremennye tak-kak eto nadezhnej i
bystree. private peremennye obespechivayut leksicheskuyu oblast' primeneniya
(vidimosti) a local - dinamicheskuyu. Obychno eto peremennye formatov
znachenie kotoryh dolzhno byt' vidimo iz vyzyvaemyh podprogramm.
Primenenie funkcii local() ne celesoobrazno v ciklah tak kak
ona vyzyvaetsya kazhdyj raz i takim obrazom zametno zamedlyaet vremya
vypolneniya cikla.




Dlya kratkogo opisanya tipa parametrov peredavaemyh podprogramme
mozhno primenyat' prototipy. V Pel sushchestvuyut sleduyushchie prototipy:

	Deklaraciya		Primer vyzova

	sub mylink($$)		mylink $old, $new
	sub myvec($$$)		myvec $var, $offset, 1
	sub myindex($$;$)	myindex &getstring, "substr"
	sub myreverse(@)	myreverse $a, $b, $c
	sub myjoin($@)		myjoin ":",$a,$b,$c
	sub mypop(\@)		mypop @array
	sub mysplice(\@$$@)	mysplice @array, @array, 0, @pushme
	sub mykeys(\%)		mykeys %{$hashref}
	sub myopen(*;$)		myopen HANDLE, $name
	sub mypipe(**)		mypipe READHANDLE, WRITEHANDLE
	sub mygrep(&@)		mygrep { /foo/ } $a, $b, $c
	sub myrand($)		myrand 42
	sub mytime()		mytime

Zdes':
	\'simvol'	- parametr s tipom 'simvol'

	'@' ili '%'	- vse ostavshiesya parametry kak spisok

	'$'		- skalyar

	'&'		- bezimyannaya podprogramma

	'*'		- ssylka na tablicu imen

	';'		- razgranichitel' obyazatel'nyh i ne obyazatel'nyh paramettrov.




Inogda nuzhno v kachestve parametra peredat' podprogramme ne znachenie
elementa massiva a ssylku na nego, chto by podprogramma mogla izmenit'
znachenie elementa. Dlya etogo v Pel k imeni peremennoj dobavlyaetsya
simvol '*' Podbnoe vyrazhenie nazyvayut 'type glob' tak kak v YUnikse
simvolom '*' oboznachayut "vse vozmozhnye znacheniya". Poetomu '*' dlya
massiva oznachaet "vse elementy massiva".
Dlya skalyarov upotryablyat' '*' ne imeet smysla t.k. oni i tak peredayutsya
ssylkoj i vy mozhete izmenyat' znachenie parametra izmenyaya naprimer
peremennuyu $_[0].




Bol'shinstvo vstroennyh funkcij Pel mozhno pereopredelit' svoimi
sobstvennymi. Obychno eto delayut dlya udobstva sovmestimosti Pel dlya
raznyh platform sistem.

Dlya etogo nuzhno perechislit' imena etih funkcij v vide:

	use subs 'funkciya1', 'funkciya2' ....;

i dalee v module opredelit' sami funkcii.




Esli vy popytaetes' vyzvat' ne sushchestvuyushchuyu funkciyu to Pel vydast
nemedlenno soobshchenie ob oshibke. No esli vy opredelite podprogrammu
s imenem 'AUTOLOAD' to ona budet vyzvana s temi zhe parametrami
a peremennaya $AUTOLOAD budet soderzhat' imya ne sushchestvuyushchej
podprogrammy. Dannyj mehanizm ochen' udoben dlya sredstv otladki.


Last-modified: Thu, 24 Apr 1997 18:06:07 GMT
Ocenite etot tekst: