Skip to main content

Myslíme v jazyku Perl (Ukázka, strana 99)

Page 1

98

5. Prˇ´ıkazy

je jeho hodnota povazˇova´na za pravdivou. Prvnı´ vy´raz je obvykle nazy´va´n jako inicializacˇnı´, druhy´ vy´raz se nazy´va´ podmı´nka a trˇetı´ reinicializace cyklu. ´RAZ; VY ´RAZ; VY ´RAZ) BLOK for (VY

Nejprve se provede inicializacˇnı´ cˇa´st, pak se vyhodnotı´ podmı´nka, a jestlizˇe je tento vy´raz pravdivy´, provede se BLOK. Potom se provede reinicializace cyklu. Je-li neˇjaka´ promeˇnna´ deklarovana´ v neˇktere´m z vy´razu˚ jako lexika´lneˇ vymezena´, ma´ platnost omezenou pouze na prˇ´ıkaz for. for (my $i = 1; $i <= 10; $i++) { print ”$i na 2 je ”, $i**2, ”\n”; } # to same ´ jako { my $i = 1; while($i <= 10) { print ”$i na 2 je ”, $i**2, ”\n”; } continue { $i++; } } # konc ˇ´ ı platnost prome ˇnne ´ $i

Vsˇechny trˇi vy´razy v kulaty´ch za´vorka´ch za for jsou vyhodnocova´ny ve skala´rnı´m kontextu.

Prˇ´ıkaz foreach ˇNNA ´ postupneˇ na hodnotu prvku˚ Cyklus foreach nastavuje promeˇnnou PROME v SEZNAMu a pro kazˇdou iteraci prova´dı´ BLOK. Vy´raz (seznam) v kulaty´ch za´vorka´ch za foreach je vyhodnocen v seznamove´m kontextu. Nepovinnou cˇa´stı´ cyklu je cˇa´st continue. ˇNNA ´ (SEZNAM) BLOK continue BLOK foreach PROME

Synonymem pro foreach je slovo for, proto je mozˇne´ tyto dva prˇ´ıkazy zameˇnˇovat. Za´lezˇ´ı na programa´torovi, ktere´ slovo uprˇednostnˇuje (zda je mu blizˇsˇ´ı prˇehlednost nebo strucˇnost ve vyjadrˇova´nı´). Platnost promeˇnne´ pouzˇ´ıvane´ pro iterace cyklu se lisˇ´ı podle toho, jaky´m zpu˚sobem byla nadeklarova´na. Pouzˇijeme-li prˇi deklaraci slovo my, promeˇnna´ bude lexika´lneˇ vymezena´ pouze pro blok prˇ´ıkazu˚ cyklu. Budeme-li pracovat s globa´lnı´ promeˇnnou, bude pro tento blok lokalizova´na. Znamena´ to, zˇe obsah te´to promeˇnne´ bude po skoncˇenı´ cyklu obnoven na svou pu˚vodnı´ hodnotu. Promeˇnna´ bude automaticky globa´lnı´ v prˇ´ıpadeˇ, zˇe nebude nadeklarova´na pomocı´ my. Mu˚zˇeme take´ explicitneˇ uve´st slovo our.

Ukázka elektronické knihy, UID: KOS181068


5.2 Slozˇene´ prˇ´ıkazy

99

$x = 10; # lexika ´lne ˇ vymezena ´ ˇ r´ ıdı ´cı ´ prome ˇnna ´ $x for my $x (1..5) { print $x; } # prome ˇnna ´ $x ma ´ nynı ´ hodnotu 10 (je viditelna ´ globa ´lnı ´ prome ˇnna ´), # nikoliv ta, ktera ´ byla jako ˇ r´ ıdı ´cı ´ prome ˇnna ´ cyklu # globa ´lnı ´ ˇ r´ ıdı ´cı ´ prome ˇnna ´ $x, lokalizuje se for $x (1..5) { print $x; } # prome ˇnna ´ $x ma ´ sta ´le hodnotu 10 # globa ´lnı ´ ˇ r´ ıdı ´cı ´ prome ˇnna ´ $x (vyja ´dr ˇeno explicitne ˇ), # lokalizuje se for our $x (1..5) { print $x; } # prome ˇnna ´ $x ope ˇt ma ´ hodnotu 10

Nenı´-li jme´no promeˇnne´ uvedeno, pracuje se implicitneˇ s promeˇnnou $_. Tato promeˇnna´ je take´ lokalizova´na. Je-li neˇktery´ z prvku˚ SEZNAMu l-hodnota, je mozˇne´ ho v cyklu modifikovat zmeˇˇNNA ´ (nebo $_). Promeˇnna´ cyklu se totizˇ sta´va´ aliasem nou hodnoty promeˇnne´ PROME pro kazˇdy´ prvek SEZNAMu. @cisla = (1..10); foreach (@cisla) { $_ = $_**2; } # pole @cisla obsahuje 1, 4, 9, 16, 25, 36, 49, 64, 81, 100

Chceme-li zjistit, kolika´ty´ prvek v seznamu zpracova´va´me, musı´me si explicitneˇ vytvorˇit neˇjake´ pocˇ´ıtadlo. Neexistuje totizˇ nic, co by na´m umozˇnilo rˇ´ıci, kde se v seznamu pra´veˇ nacha´zı´me.

ˇ ´ızenı´ cyklu˚ R Prˇ´ıkazy pro rˇ´ızenı´ cyklu˚ umozˇnˇujı´ zmeˇnit zpu˚sob prova´deˇnı´ prˇ´ıkazu˚ v bloku cyklu nebo v bloku continue. Vztahujı´ se vzˇdy k nejblizˇsˇ´ımu obalovacı´mu cyklu. Chcemeli, aby bylo mozˇne´ prova´deˇt skoky i o neˇkolik u´rovnı´ vy´sˇe, musı´me si cyklus neˇjaky´m

Ukázka elektronické knihy, UID: KOS181068


5. Prˇ´ıkazy

100

zpu˚sobem pojmenovat. K tomu slouzˇ´ı na´veˇsˇtı´, ktere´ mu˚zˇe nepovinneˇ prˇedcha´zet vlastnı´mu prˇ´ıkazu cyklu. Vhodny´m jme´nem na´veˇsˇtı´ je vy´stizˇne´ vyja´drˇenı´ toho, cˇeho se cyklus ty´ka´. Na´veˇsˇtı´ se zpravidla pı´sˇ´ı velky´mi pı´smeny a ihned za nı´m musı´ na´sledovat dvojtecˇka. Na takto pojmenovany´ prˇ´ıslusˇny´ cyklus je pak mozˇne´ se v prˇ´ıkazech pro rˇ´ızenı´ cyklu˚ pomocı´ na´veˇsˇtı´ odvola´vat. Prˇ´ıkaz last okamzˇiteˇ opustı´ prova´deˇnı´ cyklu, jestlizˇe existuje blok continue, tento blok se neprovede. Prˇ´ıkaz next ukoncˇ´ı prova´deˇnı´ aktua´lnı´ iterace cyklu a zacˇne novou iteraci vyhodnocenı´m podmı´nky. Jestlizˇe cyklus obsahuje blok continue, provede se jesˇteˇ prˇed vyhodnocenı´m podmı´nky. Pokud prˇ´ıkaz next vola´me v bloku continue, v dalsˇ´ı iteraci cyklu se spustı´ azˇ tento blok. Prˇ´ıkaz redo spustı´ iteraci cyklu znovu, bez opeˇtovne´ho vyhodnocova´nı´ podmı´nky. Blok continue se neprova´dı´. Na´sledujı´cı´ prˇ´ıklad cˇte rˇa´dky ze souboru a zpracova´va´ je. Je-li nacˇten pra´zdny´ rˇa´dek, nenı´ co zpracova´vat a je spusˇteˇna dalsˇ´ı iterace cyklu. RADEK: while ( <SOUBOR> ) { next RADEK if /ˆ$/; # zpracova ´nı ´ dat ... ... }

Jme´no na´veˇsˇtı´ RADEK zde naznacˇuje, zˇe se zpracova´vajı´ rˇa´dky souboru. Pouzˇitı´ na´veˇsˇtı´ u prˇ´ıkazu next je v tomto prˇ´ıpadeˇ zbytecˇne´ stejneˇ jako pojmenova´nı´ cyklu. Zprˇehlednˇuje ale ko´d programu a v prˇ´ıpadeˇ vnorˇeny´ch cyklu˚, kdy je potrˇebne´ ukoncˇit prova´deˇnı´ neˇktere´ho z nadrˇazeny´ch cyklu˚, je pouzˇitı´ na´veˇsˇtı´ nezbytne´.

5.3

Hole´ bloky

Holy´ blok je cˇa´st ko´du uzavrˇena´ do dvojice slozˇeny´ch za´vorek. Je povazˇova´n za cyklus, ktery´ se prova´dı´ pra´veˇ jednou. I zde je tedy mozˇne´ pouzˇ´ıt pojmenova´nı´ bloku pomocı´ na´veˇsˇtı´ a lze pouzˇ´ıt prˇ´ıkazy pro rˇ´ızenı´ cyklu˚ a blok continue. open SOUBOR, ’data.txt’; $radku=0; BLOK: { while (<SOUBOR>) { ´VAT/; next BLOK if /NEZPRACOVA # zpracova ´nı ´ dat ... ... $radku++;

Ukázka elektronické knihy, UID: KOS181068


Turn static files into dynamic content formats.

Create a flipbook
Myslíme v jazyku Perl (Ukázka, strana 99) by Kosmas-CZ - Issuu