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.
Deklaracii (ob®yavleniya).
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.
Operatory upravleniya ciklom.
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.
POD operatory. Dokumentirovanie programm.
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