Dnešní díl odhalí další příkazy pro řízení provádění skriptů - cykly.
9.12.2004 15:00 | Josef "jose" Kadlec | přečteno 9450×
Cykly slouží v případě, že potřebujete nějaký blok opakovat do doby, než bude splněna určitá podmínka nebo proběhne vámi daný počet iterací.
První formou cyklu je příkaz while
a jeho modifikace. Nejjednodušší zápis tohoto cyklu
vypadá takto:
while (pravdivostni_vyraz)
{
prikaz1;
prikaz2;
...
}
Nejprve se tedy vyhodnotí pravdivostní výraz a pokud je vyhodnocen jako pravda (true), tak se provedou příkazy v bloku, který patří danému cyklu. Po projití celého bloku se vyhodnotí pravdivostní výraz znovu a podle výsledku se buď provede další iterace (v případě true) a nebo se neprovede a celý blok se přeskočí a průběh kódu bude pokračovat až za tímto blokem (v případě false). Uveďme si konkrétnější příklad:
while ($input ne "syrup")
{
print "Zadejte správné heslo:";
$input = <STDIN>;
chomp ($input);
}
Po spuštění skriptu budete dotázáni na heslo a na toto heslo budete dotazováni do doby, než zadáte správné heslo "syrup". Všimněte si, že pro práci se standardním vstupem se používá zápis <STDIN>.
Pokud budeme chtít provést příkazy v případě, že pravděpodobnostní výraz bude vyhodnocen jako
nepravda (false), můžeme použít příkaz until
. Obecný zápis by vypadal takto:
until (pravdivostni_vyraz)
{
prikaz1;
prikaz2;
...
}
Další formou cyklů je struktura zápisu, kdy je vyhodnocení pravděpodobnostního výrazu prováděné na konci bloku - tzn. že blok proběhne minimálně jednou. Obecný zápis by vypadal takto:
do
{
prikaz1;
prikaz2;
...
} while (pravdivostni_vyraz)
Využívá se tedy kromě samotného příkazu while
ještě příkaz do
. Analogicky
bychom použili příkaz until
. Ukážeme si na příkladě:
$pokus = 0;
do
{
$pokus++;
print $pokus;
print "Zadejte správné
heslo:";
$input = <STDIN>;
chomp ($input);
} until ($pokus == 5 || $input eq "syrup");
Toto je jakási "vylepšená" verze našeho skriptu, který jsem uvedl výše a dělá úplně to samé, pouze s tím rozdílem, že omezuje zadávání hesla na pět pokusů. Jinak tento příklad slouží pouze jako názorná ukázka fungování cyklů a nemá v této podobě praktického využití.
Při tvorbě iterací lze dále využít příkaz for
a jeho modifikaci foreach
pro práci s elementy seznamu, jakožto datové struktury. Obecný zápis by vypadal takto:
for (pocatecni_hodnota; pravdivostni_vyraz; zmena_hodnoty)
{
prikaz1;
prikaz2;
...
}
Iterace budou probíhat do doby než bude splněno pravdivostní vyhodnocení, kde první hodnota, která bude testována je první argument a jeho změna po každém průchodu je argument třetí. Argumenty jsou odděleny středníky. Pokud potřebujeme více výchozích hodnot nebo změn, lze je oddělit čárkami. Lepší bude ukázat si příklad:
for ($i=1; $i<=10; $i++)
{
print "Probíhá cyklus:
$i\n";
}
Tímto jsme vytvořili skript, který vytvoří deset iterací - tzn. tělo skriptu proběhne desetkrát. Nekonečný cyklus by mohl vypadat takto:
for (;;)
{
print "Probíhá cyklus:
$i\n";
}
Již zmíněný příkaz foreach
je výhodný tím, že mu nemusíte dodávat informace o počtu
iterací (tzn. argumenty příkazu for
), ale příkaz si je určí sám - např. z počtu prvků
pole. Kdybychom chtěli napodobit příklad skriptu s příkazem for
, vypadalo by to takto:
foreach $i (1
.. 10)
{
print "Probíhá cyklus:
$i\n";
}
Zápis "1 .. 10" charakterizuje vlastně pole, kde je deset prvků, které představují posloupnost čísel od 1 do 10. I když jsme pole ještě neprobírali, ukážeme si ten samý příklad s polem:
@pole = (1,2,3,4,5,6,7,8,9,10)
foreach $i (@pole)
{
print "Probíhá cyklus:
$i\n";
}
Dále se podíváme na některé dodatkové a často potřebné příkazy k cyklům. Pokud budete chtít
"násilně" ukončit cyklus, i když ještě neproběhly všechny iterace, uděláte to příkazem
last
.
Pokud budete chtít ukončit aktuální (tzn. právě probíhající) cyklus, provedeme to příkazem
next
. Bude se pokračovat následující iterací.
Příkaz redo
zase zopakuje aktuální cyklus - bez vyhodnocení pravdivostního výrazu nebo
bez inkrementace počítadla iterací.