2022年的 Tcl/Tk 編程入門參考 5.條件、遍歷、循環(huán)
這是編程語言普遍具有的控制特性,在介紹之前,讓我先介紹一下Tcl/Tk里的布爾值。
布爾值
布爾值是編程語言中,普遍存在的一種數(shù)據(jù)類型。即便沒有這種數(shù)據(jù)類型,也會有這個概念,比如Tcl/Tk。
布爾值表示 "是、非" 或者 "真、假" 這么一個成對的概念。Tcl語言里都是字符串,它通過一些特定字符表示布爾值。首先,很好理解的表示布爾值的單詞(大小寫均可):
yes, no
true, false
on, off
其次,數(shù)值 1, 0
但是實際上tcl語言中還有很多情況表示布爾值:
此外,布爾值單詞的一部分,也被認為是布爾值(??這是極其坑爹的設定)

if ?條件
如果 {表達式結(jié)果為"真"} 那么 {搞點事情~}
基本用法:if {表達式} then {代碼段}
if命令用于條件執(zhí)行。它需要兩個必要參數(shù):一個參數(shù)是表達式,另一個是代碼段,而then參數(shù)是可選的。當表達式運算結(jié)果為真時就會執(zhí)行代碼段。
else
else參數(shù):如果表達式結(jié)果為“假”時,就運行一段代碼。
if {表達式} ?then? {代碼段} else {代碼段2}
如果 {表達式結(jié)果為"真"} 那么 {搞點事情~} 否則 {另外搞點事情~}
elseif
elseif類似于在else后面再接一個if命令。一個if命令可以有多個elseif。
如果 {表達式結(jié)果為"真"} ?{搞點??事情}
要不換個姿勢 {表達式2結(jié)果為"真"} ?{搞點*事情}
再試一次 {表達式3結(jié)果為"真"} ?{搞點??事情}
實在不行 {搞點??事情}
*注意,雖然看上去像語法,但是if命令就是普通的Tcl命令,它有接受多個參數(shù),其中像then、else和elseif這樣的參數(shù)屬于預設參數(shù),后接的代碼段,無論多長本身也是參數(shù)。
switch 匹配
switch ??可選參數(shù)? ?字符串 ?匹配值1 ?代碼段1 ?匹配值2 ?代碼段2....
switch命令用于進行匹配操作,該命令需要指定一個字符串來跟多個值進行匹配,每個進行匹配的值都有一段對應的代碼段,當字符串與匹配值相同時,就執(zhí)行這個匹配值對應的代碼段。
*提示:Tcl語言的字符串只要不是{}括起來的,都能進行變量替換和命令替換。
該命令用于簡化需要使用多個 if...elseif 語句的情況,也就是說如果不怕麻煩的話,該命令也可以用if...elseif語句來改寫。
可選參數(shù)
?-exact ?嚴格模式(默認值,精確識別特殊字符,比如: *、$ )
?-glob ?與 string match 命令相同,支持 * ? 匹配
?-regexp ?正則表達式
?-nocase ?不區(qū)分大小寫
?-- ?表示參數(shù)結(jié)束(用于匹配字符串以 - 開頭時,這會導致tcl誤認為是參數(shù)-xxx)
foreach 遍歷
foreach ?變量名 ?列表 ??變量名2? ??列表2? ?{代碼段}
用于遍歷列表中的所有元素:
按順序?qū)⒃刭x值給變量,并執(zhí)行代碼段
完畢后,將下一個元素賦值給變量,再次執(zhí)行代碼段……
不斷重復直到遍歷全部元素
*提示:如果元素不足時,用空字符代替
?
break 中斷
break中止當前的遍歷/循環(huán),直接結(jié)束遍歷/循環(huán)命令。也有叫它“跳出”的。
?
continue 跳過
continue 跳過本輪遍歷/循環(huán),直接進入下一輪
incr 增加
incr 給變量增加數(shù)值,主要搭配下面介紹的循環(huán)命令。
incr 變量名 ?增量? ?(變量值和增量都必須為整數(shù))
for 循環(huán)
for ?起始定義 ?測試條件 ?每輪最后執(zhí)行的語句 ?{代碼段}
For命令,也就是for循環(huán),是編程語言里的經(jīng)典循環(huán)語句,各個編程語言的具體實現(xiàn)略有不同,但是功能都類似。
TCL語言的for命令需要四個參數(shù):第一個參數(shù)起始定義,第二測試條件,第三個參數(shù)是每輪最后執(zhí)行的語句,最后一個參數(shù)是{代碼段}。
for命令的運行方式:
首先只運行一次<起始定義>部分的語句
然后進入循環(huán),判斷<測試條件>的執(zhí)行結(jié)果是否為真,如果結(jié)果為真,就運行{代碼段}中的代碼,代碼段運行完畢之后,再運行<每輪最后執(zhí)行的語句>,運行完畢之后,本輪結(jié)束,進入下一輪
下一輪繼續(xù)判斷<測試條件>的執(zhí)行結(jié)果是否為真,如果為真,就繼續(xù)執(zhí)行{代碼段}和<每輪最后執(zhí)行的語句>,然后繼續(xù)進入下一輪
一直循環(huán)直到<測試條件>為假,結(jié)束命令。
?
while 循環(huán)
while 測試條件 {代碼段}
只要測試條件為"真",就會反復執(zhí)行代碼段
?