![a2cc65b521b8bc954d18b2c6a0746a41.png](https://img-blog.csdnimg.cn/img_convert/a2cc65b521b8bc954d18b2c6a0746a41.png)
笔记(一)讲文本输出、变量定义和调用、字符串、表达式:
苏蛰:基于tcl/tk的Hyperworks二次开发学习笔记(一)zhuanlan.zhihu.com![4c8150e5c6fa2ed08296e5a6457055a4.png](https://img-blog.csdnimg.cn/img_convert/4c8150e5c6fa2ed08296e5a6457055a4.png)
笔记(二)讲列表:
苏蛰:基于tcl/tk的Hyperworks二次开发学习笔记(二)· 列表zhuanlan.zhihu.com![188c8ac55f099a7d130c587db1619979.png](https://img-blog.csdnimg.cn/img_convert/188c8ac55f099a7d130c587db1619979.png)
笔记(三)讲数组:
苏蛰:基于tcl/tk的Hyperworks二次开发学习笔记(三)· 数组zhuanlan.zhihu.com![f838e305c9ece4205c50b0c2faa21fe3.png](https://img-blog.csdnimg.cn/img_convert/f838e305c9ece4205c50b0c2faa21fe3.png)
这一篇分享关于条件结构和循环结构的学习心得,为第七个模块。话不多说,直接上学习笔记。
1. 条件语句
条件语句主要就两个:if-else 和 switch。
- if-else
格式如下所示:
if expr1
通常,实际用起来,应该是这样的画风:
If
逻辑上很好理解,逐条看条件表达式是否为真,为真就执行相应的执行语句,就不举例子说明了。
但是诸位!!诸位!!请听我说一句!请务必注意这里的大括号们:
a. 执行语句的前半个大括号,必须跟条件表达式在同一行,否则会报错。
b. 如果执行语句后面有else、elseif,那么后半个大括号又得跟else、elseif在同一行,否则会报错。
c. 不同对大括号之间, 以及elseif、else跟它们前面那个大括号必须用空格隔开,否则你将会解锁名为“extra characters after close-brace”的Error。
以上经验是我蘸着悔恨的血泪写下的,适用且不限于switch啊,程序proc啊,循环for啊等等情况出现的大括号。切记切记!
- switch
并不是能玩游戏的那个switch。啊,好想买一个……
言归正传,我们要讲的switch跟C++里面的switch逻辑上类似,但是又有一些不同,既没有case,也没有顺序执行直到break,tcl的switch只执行第一个满足条件的语句。
标准格式如下
switch
逻辑上就是,将string和pattern进行匹配,执行第一个满足条件的body。当没有符合条件的输入,将会返回空字符串,建议在末尾加一个default,这样,即使没有符合条件的输入,也能输出点东西提醒自己。
option是进阶用法,可以不写,默认其状态为-exact。
举个例子:
set star
输出结果为it’s OK。
至于进阶用法,我也大概看了看,就写一写我能明白的部分。
-exact
前面提到过,这个是默认选项,就是寻找百分百匹配string的pattern。
-glob
跟之前string match 一样,按照glob-style方式来的,用星号(*)代表其他字符。
举个例子:
#例子1
输出结果为Not bad,虽然ab*也符合,但没办法,因为a*是第一个匹配条件的pattern。
这里如果没有-glob,则输出Nothing found.
-nocase
表明string和pattern匹配过程中不区分大小写。
比如说,我将例子1改为:
#例子2
因为加上了-nocase则仍然可以输出Not bad,如果没有-nocase,毫无疑问,输出Nothing found。
- (←_←,看到了吗?这是一个短横)
它可以使用在两个地方,一个是作为option,表示option这部分结束啦,后面就是string。因为是作为option使用,所以需要注意,必须是--,不是单独的-。
第二个是使用在body里面,表示跟下一个body的内容相同。
把例子2改成下面这个样子:
#例子3
输出结果就变成了 it’s OK。
除了上面这几个,还有一些其他的选项:
-regexp 按照re_syntax命令的正则方式匹配string和pattern。
-matchvar varName 这个需要和-regexp搭配使用才是合法的。
说实话,我虽然帮助文档里的例子看懂了,但是想不到实际中会应用在哪里,另外,我对于正则方式也不是很明白,这里就不多说了,以后知识库刷新了再更吧。
2. 循环语句
三个语句(for、 while、foreach),以及两个命令(break、continue)。
- for
格式为
for
举个简单的例子:
for
仍然要注意,不同对大括号之间的空格和body前面的那半个大括号需要和for在同一行。
有的人不太喜欢如此排版,那么可以像下面这样使用一个反斜杠,这样即可表示下一行那半个大括号仍是属于本行的。
for
next 那里最常用的是incr递增,当然,也可以有其他的设定,比如说:
for
这样写,那么判定计数的变化模式就更改了。总体来说没有什么坑。
- while
格式为
while
当test条件为真,则进入循环体。直接用帮助文件里的例子看一下:
set x
另外,还有while {1} { body } ,这样呢,就是一个死循环的亚子。我有看到说,TCL程序员更普遍使用while {1} 构造以表示无限循环,可以通过按 Ctrl+ C键来终止无限循环。但我暂时还没明白这个无限循环的意义。欢迎有人解答。
- foreach
格式通常有以下两种
foreach varname list body
foreach通常用来遍历list里的元素来参与循环。在循环时,list中的元素会类似被lindex命令调用一样从前到后依次赋给varName,然后进入循环体body中的执行相应命令。
1)循环一个列表,用格式1
foreach varname list body
举个例子:
set var
变量a就会遍历列表var内的元素,依次输出结果。
2)循环多个列表,用格式2
foreach varlist1 list1
继续举例子:
#例子4
输出结果为
![92f0cf702153fda7aca6d08d80df9b49.png](https://img-blog.csdnimg.cn/img_convert/92f0cf702153fda7aca6d08d80df9b49.png)
因为循环次数以最大列表长度为准,元素不足的那个列表会用空字符串填充,所以输出结果里有个“Day 8 is .”。
- break 和continue
这两个命令基本跟C++是一样的。break用于循环结构中提前终止所在的整个循环,如果有循环嵌套的话,在内循环里的break,就是终止它所在的内循环,继续执行之后外循环的内容;而continue则是提前结束本轮循环,继续进入下一次迭代。
比如说,把上面的例子4改为:
set var
那么输出结果为
![153d4517528c48d3175565a4fe63db58.png](https://img-blog.csdnimg.cn/img_convert/153d4517528c48d3175565a4fe63db58.png)
没有Day 3,也没有Day 8。
至于循环嵌套什么的,万变不离其宗,就不展开记录了。