- 8.1 if
- 8.2 switch
- 8.3 循环命令:while、for、foreach
- 8.4 循环控制:break与continue
- 8.5 eval 命令
- 8.6 从文件运行
命令:if test1 body1 ?elseif test2 body2 elseif ...? ?else bodyn?
作用:将test作为表达式处理。如果为真,将body作为Tcl脚本处理,返回它的值。
- 对if和其他控制结构获取的表达式和脚本所用的解析方法与对Tcl所有命令的所有参数所用解析方法相同,建议总是把表达式和脚本放在大括号中,这样再命令执行前不会有替换发生。
- 注意换行符是命令分隔符,所以每个左大括号必须与它的前一个单词位于同一行。
- 回顾大括号引用:如果一个单词以左大括号开头,那么直到与它匹配的右大括号为止,所有字符都将被原封不动地识别为这个单词的值。这个单词中不会发生任何替换,所有的而空格、制表符、换行符以及分号都作为普通字符处理。
if {test1} {
body1
} elseif {test2} {
body2
} ... {...} {
...
} else {
bodyn
}
8.2 switch
命令:
- 形式一:
switch ?options? string {pattern body ?pattern body ...?}
- 形式二:
switch ?options? string pattern body ?pattern body ...?
作用:把string和各pattern进行匹配,知道找到一个匹配的pattern,然后执行它后面对应的body。返回执行改body的结果,如果没有匹配的pattern,则返回空字符串。options可以是-exact、-glob、-regexp或–(用来代表选项结束) 形式一:
switch $x {
a {incr t1}
b {incr t2}
c {incr t3}
}
形式二:
switch $x \
a {incr t1} \
b {incr t2} \
c {incr t3}
可见,形式一可以很方便的和对应的脚本写成多行格式。
switch的匹配模式:
- -exact(默认):严格的字符串比较。
- -glob:string match命令下的匹配。
- -regexp:正则表达式匹配。
set t1 0
set t2 0
set t3 0
foreach i $x {
switch -regexp -- $i {
a {incr t1}
^[0-9]+$ {incr t2}
default {incr t3}
}
}
- 模式default可以与任意值匹配。
- 用
--
来标记选项的结束,避免以-
开头的检测值被误认为选项。 - 如果某个模式的body与下一模式相同,可用
-
代替。 - 注意注释不能加在大括号内。
命令:while test body
作用:若表达式test的值为真,将body作为Tcl脚本运行。重复这个过程知道test为假。
命令:for init test reinit body
作用:将init作为一个脚本运行,然后将test作为一个表达式处理。如果test的值为真,将body作为Tcl脚本运行,然后将reinit作为Tcl脚本运行,然后将test作为表达式处理。重复这个过程直到test的值为假。
命令:
- 形式一:
foreach varName list body
- 形式二:
foreach varlist1 list1 ?varlist2 list2 ...? body
作用:把变量varName按顺序设置为list中的每一个元素,然后将body作为Tcl脚本运行。返回一个空字符串。list必须是有效的Tcl列表。
set b {}
set i [expr {[llength $a] - 1}]
while {$i >= 0} {
lappend b {lindex $a $i}
incr i -1
}
set b {}
for {set i [expr {[llength $a] - 1}]} {$i >= 0} {incr i -1} {
lappend b {lindex $a $i}
}
set b {}
foreach i $a {
set b [linsert $b 0 $i]
}
8.4 循环控制:break与continue
- break命令引起最内层循环的命令立即终止循环。
- continue命令只终止最内层循环的当前迭代步。
- 用于创建和运行Tcl脚本的通用构造块,与matlab中eval命令功能一致。
set reset {
set a 0
set b 0
set c 0
}
eval $reset
8.6 从文件运行
source命令读取一个文件,将其作为Tcl脚本运行。source获取一个参数,该参数指定要读取的文件名。
source init.tcl
source的返回值就是运行文件内容的返回值,即文件中命令最后一条命令的返回值。另外,source运行在文件中使用return命令终止进程。