怎么结束switch循环_tcl/tk学习笔记(四)· 条件与循环

a2cc65b521b8bc954d18b2c6a0746a41.png

笔记(一)讲文本输出、变量定义和调用、字符串、表达式:

苏蛰:基于tcl/tk的Hyperworks二次开发学习笔记(一)​zhuanlan.zhihu.com
4c8150e5c6fa2ed08296e5a6457055a4.png

笔记(二)讲列表:

苏蛰:基于tcl/tk的Hyperworks二次开发学习笔记(二)· 列表​zhuanlan.zhihu.com
188c8ac55f099a7d130c587db1619979.png

笔记(三)讲数组:

苏蛰:基于tcl/tk的Hyperworks二次开发学习笔记(三)· 数组​zhuanlan.zhihu.com
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

因为循环次数以最大列表长度为准,元素不足的那个列表会用空字符串填充,所以输出结果里有个“Day 8 is .”。

  • break 和continue

这两个命令基本跟C++是一样的。break用于循环结构中提前终止所在的整个循环,如果有循环嵌套的话,在内循环里的break,就是终止它所在的内循环,继续执行之后外循环的内容;而continue则是提前结束本轮循环,继续进入下一次迭代。

比如说,把上面的例子4改为:

set var 

那么输出结果为

153d4517528c48d3175565a4fe63db58.png

没有Day 3,也没有Day 8。

至于循环嵌套什么的,万变不离其宗,就不展开记录了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值