2022年的 Tcl/Tk 编程入门参考 5.条件、遍历、循环
这是编程语言普遍具有的控制特性,在介绍之前,让我先介绍一下Tcl/Tk里的布尔值。
布尔值
布尔值是编程语言中,普遍存在的一种数据类型。即便没有这种数据类型,也会有这个概念,比如Tcl/Tk。
布尔值表示 "是、非" 或者 "真、假" 这么一个成对的概念。Tcl语言里都是字符串,它通过一些特定字符表示布尔值。首先,很好理解的表示布尔值的单词(大小写均可):
yes, no
true, false
on, off
其次,数值 1, 0
但是实际上tcl语言中还有很多情况表示布尔值:
此外,布尔值单词的一部分,也被认为是布尔值(😱这是极其坑爹的设定)

if 条件
如果 {表达式结果为"真"} 那么 {搞点事情~}
基本用法:if {表达式} then {代码段}
if命令用于条件执行。它需要两个必要参数:一个参数是表达式,另一个是代码段,而then参数是可选的。当表达式运算结果为真时就会执行代码段。
else
else参数:如果表达式结果为“假”时,就运行一段代码。
if {表达式} ?then? {代码段} else {代码段2}
如果 {表达式结果为"真"} 那么 {搞点事情~} 否则 {另外搞点事情~}
elseif
elseif类似于在else后面再接一个if命令。一个if命令可以有多个elseif。
如果 {表达式结果为"真"} {搞点😼事情}
要不换个姿势 {表达式2结果为"真"} {搞点*事情}
再试一次 {表达式3结果为"真"} {搞点🦊事情}
实在不行 {搞点🐼事情}
*注意,虽然看上去像语法,但是if命令就是普通的Tcl命令,它有接受多个参数,其中像then、else和elseif这样的参数属于预设参数,后接的代码段,无论多长本身也是参数。
switch 匹配
switch ?可选参数? 字符串 匹配值1 代码段1 匹配值2 代码段2....
switch命令用于进行匹配操作,该命令需要指定一个字符串来跟多个值进行匹配,每个进行匹配的值都有一段对应的代码段,当字符串与匹配值相同时,就执行这个匹配值对应的代码段。
*提示:Tcl语言的字符串只要不是{}括起来的,都能进行变量替换和命令替换。
该命令用于简化需要使用多个 if...elseif 语句的情况,也就是说如果不怕麻烦的话,该命令也可以用if...elseif语句来改写。
可选参数
-exact 严格模式(默认值,精确识别特殊字符,比如: *、$ )
-glob 与 string match 命令相同,支持 * ? 匹配
-regexp 正则表达式
-nocase 不区分大小写
-- 表示参数结束(用于匹配字符串以 - 开头时,这会导致tcl误认为是参数-xxx)
foreach 遍历
foreach 变量名 列表 ?变量名2? ?列表2? {代码段}
用于遍历列表中的所有元素:
按顺序将元素赋值给变量,并执行代码段
完毕后,将下一个元素赋值给变量,再次执行代码段……
不断重复直到遍历全部元素
*提示:如果元素不足时,用空字符代替
break 中断
break中止当前的遍历/循环,直接结束遍历/循环命令。也有叫它“跳出”的。
continue 跳过
continue 跳过本轮遍历/循环,直接进入下一轮
incr 增加
incr 给变量增加数值,主要搭配下面介绍的循环命令。
incr 变量名 ?增量? (变量值和增量都必须为整数)
for 循环
for 起始定义 测试条件 每轮最后执行的语句 {代码段}
For命令,也就是for循环,是编程语言里的经典循环语句,各个编程语言的具体实现略有不同,但是功能都类似。
TCL语言的for命令需要四个参数:第一个参数起始定义,第二测试条件,第三个参数是每轮最后执行的语句,最后一个参数是{代码段}。
for命令的运行方式:
首先只运行一次<起始定义>部分的语句
然后进入循环,判断<测试条件>的执行结果是否为真,如果结果为真,就运行{代码段}中的代码,代码段运行完毕之后,再运行<每轮最后执行的语句>,运行完毕之后,本轮结束,进入下一轮
下一轮继续判断<测试条件>的执行结果是否为真,如果为真,就继续执行{代码段}和<每轮最后执行的语句>,然后继续进入下一轮
一直循环直到<测试条件>为假,结束命令。
while 循环
while 测试条件 {代码段}
只要测试条件为"真",就会反复执行代码段