for
for start test next body
for是一个与C语言中for结构类似的循环命令。start、next和body必须是Tcl命令字符串,test是表达式字符串。for命令首先调用Tcl解释器来执行start进行一些初始化操作。然后将test做为表达式进行评估。如果评估结果非零,则调用Tcl解释器执行body,然后调用解释器执行next,然后重复以上步骤,直到test表达式评估结果为零。如果在body中调用了continue命令,则跳过当前body中continue后面的命令,进入下一次循环。如果在body中调动了break命令,则终止for循环命令。for循环命令返回一个空字符串。
for {set x 0} {$x<5} {incr x} {
puts $x;
}
for循环中的test表达式必须要用大括号包围起来,否则会在for循环之前首先进行变量替换,这会导致test表达式无法感知到变量的变更,从而导致循环不执行或者无限循环。当test表达式被大括号包围起来,会使变量替换延迟到表达式求值时,从而能偶感知变量的变更。具体是无限循环还是循环不执行,取决于变量替换后表达式的值。如果值为非零则会无限循环,否则循环不执行。
foreach
foreach varName list body
foreach varlist1 list1 ?varlist2 list2 ...? body
foreach循环命令可以循环一个或多个列表中的值。在循环时,list中的元素会像使用lindex命令一样从前到后依次分配给varName,然后调用Tcl解释器执行body中的命令。
set values {a b c d e f g h}
foreach value $values {
puts $value
}
foreach还可以同时循环多个列表。每个列表都有一个与之对应的循环变量。在每次迭代时都会将list中的值分配给对应的varlist。list中的每个值会按顺序使用一次。最大迭代次数为list的最大元素数,从而保证list中的值一地你给会被迭代一次。如果列表中的值已经分配完毕,但是循环未结束,则使用空字符串填充对应的循环变量。
set values {a b c d e f g h}
set numbers {1 2 3 4 5}
foreach number $numbers value $values {
puts "number:$number->value:$value"
}
list中的值每次可以迭代多个,只需要将varName指定为一个变量列表。每次迭代时会从list中取出列表中变量数量个值,依次分配给变量列表中的变量。当list中元素数量不足时会用空字符串填充变量。
set numbers {1 2 3 4 5}
set values {a b c d e f g h}
foreach {i j k} $values {
puts "$i--$j--$k"
}
foreach number $numbers {i j} $values {
puts "$number--$i--$j"
}
while
while test body
while命令首先计算test表达式的值,如果为true,则调用Tcl解释器执行body中的命令。执行完body中命令后,会再次计算test表达式,重复以上步骤直到test表达式为false为止。如果在body中调用了continue命令,则跳过当前body中continue后面的命令,进入下一次循环。如果在body中调动了break命令,则终止while循环命令。while循环命令返回一个空字符串。
set x 0
while {$x<5} {
puts $x;
incr x;
}
与for命令一样,test表达式必须用大括号包围起来。否则while循环会不执行或者无限循环。
break
通常用于循环结构for、foreach、while中提前终止break所在循环。
set x 0
while {$x<5} {
if {$x<3} {
puts $x;
} else {
break;
}
incr x;
}
continue
通常用于循环结构for、foreach、while中提前结束本轮循环。
set x 0
while {$x<5} {
if {$x==3} {
incr x;
continue;
}
puts $x;
incr x;
}