1.控制流
1.1 if语句
➢ 语法格式 :
if {判断条件} {
脚本语句
} elseif {判断条件} {
脚本语句
} else {
脚本语句}
注意:脚本语句的{
一定要写在上一行,因为如果不这样,TCL 解释器会认为if命令在换行符处已结束,下一行会被当成新的命令,从而导致错误。
1.2 循环语句
1. 循环控制指令-foreach
➢ 语法格式 : foreach 变量 列表 循环主体
➢ 功能:从第0个元素开始, 每次按顺序取得列表的一个元素, 将其赋值给变量, 然后执行循环主体一次, 直到列表最后一个元素。
举例:
% set list1 {3 2 1}
foreach i $list1 {
puts $i
}3 2 1
%
3
2
1
2. 循环控制指令-break
➢ 语法格式 : break
➢ 功能: 结束整个循环过程,并从循环中跳出
举例:
% set list1 {3 2 1}
foreach i $list1 {
if {$i == 2} {
break
}
puts $i
}3 2 1
%
3
3. 循环控制指令-continue
➢ 语法格式 : continue
➢ 功能: 仅结束本次循环
举例:
% set list1 {3 2 1}
foreach i $list1 {
if {$i == 2} {
continue
}
puts $i
}3 2 1
%
3
1
4. 循环控制指令-while
➢ 语法格式 : while 判断语句 循环主体
➢ 功能: 如果判断语句成立(返回值非0),就运行脚本,直到不满足判断条件停止循环,此时while命令中断并返回一个空字符串。
举例:
% set i 3
while {$i>0} {
puts $i
incr i -1; #set i [expr $i -1]
}
3
%
3
2
1
5. 循环控制指令-for
➢ 语法格式 :
for 参数初始化 判断语句 重新初始化参数 循环主体
➢ 功能: 如果判断语句返回值非0就进入循环,执行循环主体后,再重新初始化参数。然后再次进行判断,直到判断语句返回值为0,循环结束。
举例:
% for {set i 3} {$i>0} {incr i -1} {
puts $i
}
3
2
1
2. 过程函数
1. 过程函数-proc
➢ 语法格式 : proc 函数名 参数列表 函数主体
➢ 功能: 类似于C语言中的函数。即用户自定义的功能,方便多次调用。
举例:
% proc add {a b} {
set sum [expr $a + $b]
return $sum
}
add 3 4
7
2. 全局变量与局部变量
➢ 全局变量:在所有过程之外定义的变量。
➢ 局部变量:对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除。
➢ 指令global,可以在过程内部引用全部变量
举例:
set a 1
proc sample {x} {
global a
set a [expr $a + 1]
return [expr $a + $x]
}
sample 3
5
3. 正则匹配
1. 正则匹配
➢ 定义:正则表达式是一种特殊的字符串模式,用来去匹配符合规则的字符串。
➢ 正则表达式的w
,用来匹配一个字母、数字、下划线
➢ 正则表达式的d
,用来匹配一个数字
举例:
字符串 abc123
正则表达式 wwwddd (正确)
正则表达式 dwwddd (错误)
2. 正则匹配-量词
wwwddd
这种写法过于繁琐,我们可以用代替重复的量词进行表示。在TCL中常用以下三种量词:
Syntax | Description |
---|---|
* | 零次或多次匹配 |
+ | 一次或者多次匹配 |
? | 零次或者一次匹配 |
*
和+
的区别: *
可以是零次, +
一个至少是一次。
举例:
字符串 abc123
正则表达式 w+d+ 或者 w*d*
字符串 abc123
正则表达式 d*w*d* (正确)
正则表达式 d+w+d+ (错误)
?
表示零次或者一次匹配。
举例:
正则表达式 w?w?ddwwdd
字符串 12ab34 (正确)
字符串 ab12ab34 (正确)
3. 正则匹配-锚位
➢ 锚位,用来指示字符串当中的开头和结尾的位置,使我们能够匹配到正确的字符。
Syntax | Description |
---|---|
^ | 字符串开头 |
$ | 字符串结尾 |
4. 正则匹配-其他字符
➢ 常用的其他字符还有s
和.
➢ s
表示空格
举例:
字符串 123 abc 123
正则表达式 d+sw+sd+
➢ .
表示任意一个字符,不确定具体是什么字符是就可以用.
表示。例如已知知字符串为”xxx空格xxx空格xxx”(x为未知字符)。用.+s.+s.+
就可以匹配
5. 正则匹配指令-regexp
➢ 语法格式 : regexp? switches? exp string? matchVar? ?subMatchVar subMatchVar …?
➢ 功能: 在字符串中使用正则表达式匹配。
➢ switches:
-nocase将字符串中的大写都当成小写看待。
➢ exp 正则表达式
➢ string 用来进行匹配的字符串
➢ matchstring表示用正则表示式匹配的所有字符串
➢ sub1表示正则表达式中的第一个子表达式匹配的字符串
➢ sub2表示正则表达式中的第二个子表达式匹配的字符串
6. 实例
如何匹配字符串”abc456”?
% regexp {w+d+} "abc456"
1
如何匹配一个以数字开头并且以数字结尾的字符串?
% regexp {^d.*d$} "1 sdfa 1"
1
7. 捕获变量
➢ 通过()可以捕获字符串
举例: 例如如何将字符串“Snow is 30 years old”中30捕获出来?
% regexp {s(d+).*} "Snow is 30 years old" total age
1
% puts $total #{}中的捕获
30 years old
% puts $age #()中的捕获
30
➢ 一次捕获多个字符串
举例:例如如何将字符串“Snow is 30 years old”中Snow 和30一次捕获?
% regexp {^(w+)sw+s(d+).*} "Snow is 30 years old" total name age
1
% puts $total
Snow is 30 years old
% put $name
Snow
% puts $age
30
4.文本处理
用TCL处理文本在工作中十分常用。主要掌握以下三个指令:
1. open
➢语法格式 open 文件 打开方式(打开方式 r表示读模式, w表示写模式。)
➢功能 打开文件
2. gets
➢语法格式 gets fileId 变量名
➢功能 gets读fileId标识的文件的下一行,并把该行赋给变量,并返回该行的字符数(文件尾返回-1)
3. close
➢语法格式 close fileid
➢功能 关闭文件
举例:整个读入文件过程
set INPUTFILE [open demo.txt r] #以只读模式打开文件 demo.txt
while {[gets $INPUTFILE line] >= 0} { #从第一行开始逐行读取文件
puts ($line)
}
close $INPUTFILE #关闭文件file.txt
(a b c)
举例:一个完整写入文件过程
set OUTPUTFILE [open demo.txt w]
puts $OUTPUTFILE "hello world"
close $OUTPUTFILE
参考资料:
数字集成电路静态时序分析基础_哔哩哔哩_bilibili