STA分析基础(二)TCL控制流、正则匹配、文本处理

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

来自广东
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇