Ocenite etot tekst:


Pel programma (skript) sostoit iz posledovatel'nosti deklaracij i predlozhenij.
Edinstvenno chto dolzhno byt' obyazatel'no deklarirovano eto formaty otchetov
i podprogrammy (funkcii). Vse ne ob®yavlennye peremennye, massivy, imeyut
znachenie 0 ili null.



Pel imeet svobodnyj format. Kommentarii nachinayutsya s simvola '#' i
prodolzhayutsya do konca stroki.
Deklaracii mogut ispol'zovat'sya v lyubom meste programmy tak zhe kak i
predlozheniya (statements) no dejstvuyut oni tol'ko v faze kompilyacii
programmy. Obychno ih pomeshchayut ili v nachale ili v konce programmy.
Deklaraciya podprogramm pozvolyaet ispol'zovat' imya podprogrammy
kak spiskovyj operator nachinaya s momenta deklarirovaniya.

Primer:
	sub test;	# Deklaraciya podprogrammy test

	$var1 = test $0; # Ispol'zovanie kak operatora spiska.

Deklaracii podprogramm mogut byt' zagruzheny iz otdel'nogo fajla
predlozheniem require ili zagruzheno i importirovano v tekushchuyu
oblast' imen predlozheniem use. Podrobno sm. glavu Moduli.




Prostoe predlozhenie obyazatel'no
zakanchivaetsya simvolom ';' esli tol'ko eto ne poslednee predlozhenie
v bloke gde ';' mozhno opustit'. Zamet'te chto sushchestvuyut operatory
takie kak eval{} i do{} kotorye vyglyadyat kak slozhnye predlozheniya
no na samom dele eto termy i trebuyut obyazatel'nogo ukazaniya konca
predlozheniya.

Lyuboe prostoe predlozhenie mozhet soderzhat' single modifikator
pered ';'. Sushchestvuyut sleduyushchie single modifikatory:

	if EXPR
	unless EXPR
	while EXPR
	until EXPR

gde EXPR - vyrazhenie vozvrashchayushchee logicheskoe znachenie true ili false.
Modifikatory while i until vychislyayutsya v nachale predlozheniya krome bloka do kotoryj vypolnyaetsya pervym.

if EXPR		- Modifikator "esli". Predlozhenie vypolnyaetsya esli EXPR vozvrashchaet true.

Primer:
	$var = 1;
	$var2 = 3 if $var > 0; # Rezul'tat: $var2 = 3

while EXPR	- Modifikator "poka". Predlozhenie vypolnyaetsya stol'ko raz poka EXPR = true

Primer:
	$var = 1;
	print $var++ while $var < 5; # Pechat' $var s inkrementom

Rezul'tat: 1234


until EXPR	- Modifikator "do ". Predlozhenie vypolnyaetsya  do teh por poka EXPR = false

Primer:
	$var = 1;
	print $var++ until $var > 5; # Pechat' $var s inkrementom

Rezul'tat: 12345

unless EXPR	- Modifikator "esli ne" . Obratnyj k if. Vyrazhenie vypolnyaetsya esle EXPR = false.

Primer:
	$var = 1;
	print $var++ unless $var > 5; # Pechat' $var s inkrementom

Rezul'tat: 1




Posledovatel'nost' prostyh predlozhenij ogranichennaya funkcional'nymi
ogranichitelyami nazyvaetsya blokom. V Pel eto mozhet byt'
celyj fajl, posledovatel'nost' predlozhenij v operatore eval{} ili
chashche vsego eto mnozhestvo prostyh predlozhenij ogranichennyh kruglymi
skobkami '{}'.

Suzhestvuyut sleduyushchie vidy slozhnyh predlozhenij:

	if (EXPR) BLOCK
	if (EXPR) BLOCK else BLOCK
	if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK

	LABEL while (EXPR) BLOCK
	LABEL while (EXPR) BLOCK continue BLOCK
	LABEL for (EXPR; EXPR; EXPR) BLOCK
	LABEL foreach VAR (LIST) BLOCK
	LABEL BLOCK continue BLOCK

Obratite vnimanie, chto slozhnye predlozheniya opisany v termah blokov
a ne predlozhenij kak v yazykah C ili Pascal. Poetomu neobhodimo
vsegda ispol'zovat' kruglye skobki dlya oboznacheniya bloka.

if (EXPR) BLOCK		- Vychislyaetsya logicheskoe vyrazhenie EXPR i esli true  blok vypolnyaetsya.

Primer:
	$var =1;
	if ($var == 1)
	   { print $var,"\n";
	   }
Rezul'tat: 1


if (EXPR) BLOCK else BLOCK2	-  Esli EXPR=true vypolnyaetsya BLOCK inache BLOCK2.

Primer:
	$var =2;
	if ($var == 1)
	   { print "\$var = 1\n";
	   }
	else
	   { print "\$var ne ravno 1\n";
	   }

Rezul'tat: $var ne ravno 1

if (EXPR1) BLOCK1 elsif (EXPR2) BLOCK2 ... else BLOCK	-
	Esli EXPR1=true vypolnyaetsya BLOCK1 inache esli EXPR2=true vypolnyaetsya
	BLOCK2 inache ... inache BLOCK.

Primer:
	$var = 1;
	if ($var == 0)
	   { print "\$var = 0\n";
	   }
	elsif ($var == 1)
	   { print "\$var = 1\n";
	   }
	else
	   { print "Ne izvestnoe \$var\n";
	   }

Rezul'tat: $var = 1

Cikl while vypolnyaet BLOCK do teh por poka EXPR = true. Metka LABEL ne
obyazatel'na i sostoit iz identifikatora zavershayushchegosya simvolom ':'.
Metka neobhodima pri ispol'zovanii vnutri bloka cikla upravlyayushchih
operatorov next, last i redo. Esli metka vse zhe otsutsvuet to
eti operatory ssylayutsya k nachalu blizhajshego cikla.
Blok posle continue vypolnyaetsya vsegda pered tem kak vychislyaetsya
logicheskoe vyrazhenie EXPR. |to podobno EXPR3 v predlzhenii for
poetomu v etom bloke udobno izmenyat' schetchiki i flagi cikla dazhe
esli primenyaestya operator next.



next	- podoben continue v S. Perehodit k nachalu tekushchego cikla
	t.e. povtoryaet iteraciyu.

Primer:
	M1:
	while ($i < 6)
	    {
	    ++$i;	# Uvelichivaem schetchik na 1
	    next M1 if $i < 3; # Perehodim v nachalo esli $i < 3
	    ++$i;	# inache uvelichivaem schetchik eshche raz na 1
	    }
	continue
	    {
	    print "$i "; # Pechataem $i
	    }

Rezul'tat: 1 2 4 6

last	- podoben operatoru break v yazyke S. Nemedlenno preryvaet cikl.
	Blok continue propuskaetsya.

Primer:
        M1:
        while ($i < 6)
            {
            ++$i;       # Uvelichivaem schetchik na 1
            last M1 if $i > 3; # Vyhod iz cikla esli $i > 3
            ++$i;       # inache uvelichivaem schetchik eshche raz na 1
            }
continue {
            print "$i "; # Pechataem $i
}

Rezul'tat: 2 4

redo	- nachat' novyj cikl ne vychislyaya EXPR i ne vypolnyaya continue blok.

Primer:
        M1:
        while ($i < 6)
            {
            ++$i;       # Uvelichivaem schetchik na 1
            redo M1 if $i == 3; # Dalee propustit' dlya $i = 3
            ++$i;       # inache uvelichivaem schetchik eshche raz na 1
            }
continue {
            print "$i "; # Pechataem $i
}

Rezul'tat: 2 5 7




	LABEL for (EXPR1; EXPR2; EXPR3) BLOCK
Operator for polnost'yu analogichen operatoru for v S. V pered nachalom
cikla vypolnyaetsya EXPR1, esli EXPR2 = true vypolnyaetsya blok, zatem
vypolnyaetsya EXPR3.

Primer:
	for ($i = 2; $i < 5; ++$i)
           {
           print $i, " ";
           }
        print "\nPosle cikla i = $i\n";

Rezul'tat:
	2 3 4
	Posle cikla i = 5



	LABEL foreach VAR (LIST) BLOCK

Peremennoj VAR prisvaivaetsya poocheredno kazhdyj element spiska LIST
i vypolnyaetsya blok. Esli VAR opushchenno to elementy prisvaivayutsya
vstroenoj peremennoj $_. Esli v tele bloka izmenyat' znachenie VAR
to eto vyzovet izmenenie i elementov spiska t.k. VAR fakticheski
ukazyvaet na tekushchij element spiska.
Vmesto slova foreach mozhno pisat' prosto for - eto slova sinonimy.

Primer:
        @mesyac = ("yanvar'","fevral'","mart");  # Sozdali massiv
        foreach $i (@mesyac)
            {
            print $i," ";       # Pechat' $i
            }

Rezul'tat: yanvar' fevral' mart

Primer:
        @mesyac = ("yanvar'","fevral'","mart");  # Sozdali massiv
        foreach $i (@mesyac)
            {
            $i = uc($i); # Pereveli v verhnij registr
            }
        print @mesyac;

Rezul'tat: YANVARXFEVRALXMART

Primer:

	for $i (3,5,7)
	    {
	    print "$i ";
	    }
Rezul'tat: 3 5 7




Blok ne zavisimo ot togo imeet on metku ili net semanticheski
predstavlyaet soboj cikl kotoryj vypolnyaetsya odin raz. Poetomu
dejstvie opratorov cikla next, last, redo - analogichno opisannomu
vyshe. Bloki udobny dlya postroeniya switch (pereklyuchatel') struktur.
V pel net special'nogo operatora switch podobnogo yazyku S poetomu
vy sami mozhete sozdavat' udobnye dlya vas konstrukcii. Opyt avtora
pokazyvaet chto dlya prostoty napisaniya luchshe vsego podhodit
konstrukciya vida if ... elsif ... else ... hotya mozhno sochinit'
i nechto podobnoe:

	SWITCH:
	{
	if ($i ==1 ) { .....; last SWITCH; }
	if ($i ==2 ) { .....; last SWITCH; }
	if ($i ==3 ) { .....; last SWITCH; }
	$default = 13;
	}

Vybirajte sami po svoemu vkusu.




V Pel sushchestvuet operator goto hotya gde , kak i kogda ego primenyat'
kak govoril Hodzha Nasredin "Tonkij filosovskij vopros".
Dlya nachinayushchih programmistov kotorym ot tak "nuzhen" ya by voobshche
posovetoval "zabyt'" o ego sushchestvovanii. Odnako pri sozdanii
bol'shih proizvodstvennyh zadach na poslednem etape osobenno
pri otrabotke "otval'nyh" oshibochnyh situacij konechno goto nuzhen.

V Pel realizovano tri formy goto. goto - metka, goto - vyrazhenie
i goto - podprogramma.

goto - metka vypolnyaet neposredstvennyj perehod na ukazannuyu metku.

goto - vyrazhenie - Vychislyaet imya metki i delaet sootvetsvuyushchij perehod.
	Naprimer esli my hotim sdelat' perehod na odnu iz treh metok
	"M1:", "M2:" ili "M3:" v zavisimosti ot znachenij peremennoj
	$i ravnoj 0, 1 ili 2 to eto luchshe sdelat' sleduyushchim obrazom:

	goto ("M1", "M2", "M3")[$i];

	zdes' $i ispol'zuetsya kak indeks massiva ukazannogo neposredstvenno
	v vyrazhenii.

goto podprogramma - dovol'no redkij sluchaj t.k. vsegda proshche i nadezhnej
vyzvat' podprogrammu "estestvennym" obrazom.



V Pel realizovan ochen' udobnyj mehanizm dlya napisaniya dokumentacii
v moment sozdaniya programmy. Dlya etogo primenyayutsya special'nye POD operatory.
Esli v tele programmy interpretator vstrechaet operator nachinayushchijsya
s simvola '=' naprimer:

	= head Nabor standartnyh procedur

to propuskaetsya vse do slova '=cut'. |to udobno dlya vklyucheniya
dlinnyh na neskol'ko strok ili stranic kommentariev. Zatem
s pomoshch'yu special'noj programmy pod mozhno otdelit' tekst
dokumentacii ot teksta programmy.

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