|
<< Kliknij, aby wyświetlić Spis treści >> Nawigacja: Dodatki > TCL > Sterowanie > Instrukcje iteracyjne: while, for i foreach |
Tcl dostarcza trzy instrukcje iteracyjne (pętle): while, for i foreach. Pętle while i for są podobne do swoich odpowiedników w języku C: każda z pętli powtarza wykonanie swojego skryptu pewną liczbę razy. Różnią się od siebie sposobem przerwania wykonania (warunek stopu) oraz sposobem dokonania pewnych przypisań.
While pobiera dwa argumenty: wyrażenie i skrypt. Wyznacza wartość wyrażenia, i jeśli jest ona niezerowa to wykonuje skrypt. Ten cykl jest powtarzany dopóki wyrażenie nie stanie się zerem, w tym momencie wykonanie while jest przerywane i zwracany jest pusty napis. Np., poniższy skrypt kopiuje listę ze zmiennej a do b, odwracając kolejność elementów:
set b ""
set i [expr [llength $a] –1]
while {$i >= 0} {
lappend b [lindex $a $i]
incr i –1
}
Pętla for jest podobna do while, z tą różnicą że umożliwia bardziej bezpośrednie sterowanie. Skrypt odwracający kolejność elementów może być napisany:
set b ""
for {set i [expr [llength $a] –1]} {$i >= 0} {incr i –1} {
lappend b [lindex $a $i]
}
Pierwszym argumentem pętli for jest skrypt inicjujący, drugim jest wyrażenie które wyznacza moment przerwania pętli – warunek stopu, trzecim jest skrypt reinicjujący obliczany po każdym obrocie pętli ale przed testowaniem warunku stopu, w końcu czwartym argumentem jest skrypt tworzący ciało pętli. For wykonuje swój pierwszy argument jako skrypt, następnie wyznacza wartość wyrażenia, jeśli jest ona niezerowa to wykonywane jest ciało pętli, a następnie skrypt reinicjujący i ponownie wyznaczana jest wartość wyrażenia. Cykl jest powtarzany aż wyrażenie przyjmie wartość zerową. Jeśli warunek stopu jest zerowy przy pierwszym sprawdzeniu, ani ciało funkcji ani skrypt reinicjujący nie zostanie wykonany.
Pętla foreach przechodzi po wszystkich elementach listy. Np., poniższy skrypt jest jeszcze jedną formą odwrócenia kolejności elementów:
set b ""
foreach i $a {
set b [linsert $b 0 $i]
}
foreach pobiera trzy argumenty. Pierwszy to nazwa zmiennej, drugi to lista, a trzeci to skrypt tworzący ciało funkcji. foreach wykonuje ciało funkcji raz dla każdego elementu listy, w kolejności. Przed wykonaniem ciała funkcji, w każdej iteracji pętla ustawia zmienną przechowująca element listy. Zatem jeśli w powyższym przykładzie zmienna a posiada wartość "raz dwa trzy" to ciało pętli wykona się trzy razy. W pierwszej iteracji zmienna i otrzyma wartość raz, w drugiej iteracji wartość dwa a w trzeciej trzy. Na końcu pętli zmienna b będzie posiadała wartość "trzy dwa raz" a zmienna i wartość "trzy".