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].
Pereopredelenie vstroennyh funkcij.
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