这里写目录标题
- 一、 Tcl基础
- 1.1 TCL命令格式
- 1.2 TCL脚本文件和Sourse命令
- 1.3 变量赋值与替换
- 1.3.1 赋值与释放
- 1.3.2 替换
- 1.4 引用
- 二、 Tcl表达式和计算命令
- 2.1 tcl表达式
- 2.2 TCL内置函数
- 2.3 expr命令
- 2.4 incr命令
- 三、 Tcl字符串操作
- 3.1 format命令
- 3.1.1 format 位置指示
- 3.1.2 format 其他
- 3.2 string命令
- 3.2.1 字符串长度、索引、范围
- length 命令
- index 命令
- range 命令
- 3.2.2 字符串比较
- compare命令
- match命令
- equal 命令
- 3.2.3 字符串大小写转化
- tolower 命令
- toupper 命令
- totitle 命令
- 3.2.4 字符串剪裁
- replace 命令
- map 命令
- trim 命令
- trimleft 命令
- trimright 命令
- 3.2.5 字符串重复倒叙
- repeat 命令
- reverse 命令
- 3.3 字符串匹配
- 3.3.1、正则表达式:
- 3.3.2、regexp 命令
- 3.3.3、regsub 命令
Tcl (Tool Command Language)是一种解释性的脚本语言,包含了少量的语法规则和一个核心命令集合,支持
变量、过程和控制结构。用 Tcl编写的程序可以在Linux/ Unix, Windows 和 Apple Macintosh 等操作系统下运行,,在Linux/Unix中,默认安装了Tcl命令解释器,可以直接使用T c l。通常用T c l 进行快
速原型、脚本、图形用户界面 GUI (Graphics User Interface)和
测试任务等的编程。本节简单介绍Tcl 语言的基本命令、控制结构和编程,它们是后续编写 EDA 工具的脚本的基础。
一、 Tcl基础
1.1 TCL命令格式
Tcl 格式:
command arg1 arg2...
其中命令(command ) 是内建命令或tcl的一个过程,命令和变元,变元和变元之间用空格隔开;分号或换行终止一条命令。一条命令是一行,也可以多条一行(此时用;隔开。
示例:
%puts "hello world"
hello world
% puts {hello world};
hello world
#其中%是命令提示符
#注释#前必须要有 ; ;
#因为tcl语言中命令与参数都是以空格隔开的,所以字符串中有空格时要用” ”或{ }括起来。
1.2 TCL脚本文件和Sourse命令
Tcl命令可以单条命令执行,也可以把多条命令形成一个脚本文件,通过source命令执行。
格式:
%source *.tcl
示例:
source test.tcl
1.3 变量赋值与替换
1.3.1 赋值与释放
Tcl变量类型只有字符串一种,使用前不需要声明。通过set命令实现。赋值后变量就占据了内存空间;通过unset命令取消变量定义,并且释放内存空间;
格式:
set valuename value
unset valuename
示例:
% set a 1
1
% set b $a
1
% puts "b = $b"
b = 1
1.3.2 替换
Tcl中包含三种变量替换方式:变量替换、命令替换[]、反斜杠替换。
$替换
示例:
% set a 1
1
% set b $a
1
% puts "b = $b"
b = 1
[]替换
示例:
% set a [expr 1 + 2]
3
\替换
示例:
% set a \$;
$
% set b $a;
$
#\后不要跟空格。
特殊替换:
如下图所示,glob 命令返回的是符合***.v形式的文件名列表,例如a.v b.v c.v,然而,整个文件名列表是作为一个参数传递给file delete的,file delete 会因为找不到名为a.v b.v c.v的文件而失败。要想 file delete 正常工作,glob 的结果必须被正确分隔为多个单词。可以通过参数展开来完成这一任务。
如果一个单词以字符串{* }开头,之后紧接者非空白字符,Tcl会移除开头的{*}**,把该单词的剩余部分作为含有单词分隔符的语句进行解析与替换。在替换之后,Tcl会再次解析这些单词,但不进行替换,校验确定它们的确是一个或多个语法完整的单词。如果校验通过,这些单词会被独立地加入命令行进行处理:否則,Tcl会报语法错误。因此:
file delete {*} [glob *.v]
#在由Tcl解释器进行解析和参数展开后,与下面这条语句相同:
file delete a.v b.v c.v
1.4 引用
Tcl语言提供了一些方法,阻止解析器对$和分号等特殊字符进行处理,这些方法称之为引用。常用的引用包括:
反斜杠 \ ,双引号 ” ”和大括号 { } 。
反斜杠在替换中已经介绍过了,其余两种如下:
示例1:
% set price 5
5
% set msg "egg price is \$$price"
egg price is $5
% set msg {egg price is \$$price}
egg price is \$$price
示例2:
% set name book
book
% set value 10
10
% puts [format "Item:%s\t%5.3f" $name $value]
Item:book 10.000
puts中的"Item:%s\t%5.3f"是format命令的格式说明,通常包含一些特殊的字符,如\t表示tab,由于必须在 format 命令调用前替换反斜杠,因此应当使用双引号来形成格式说明符。这里的格式用tab 分隔name 和 value,
%s和%5.3f用于说明 name 和 value 的格式。
示例3:
% set x 8
8
% set y 9
9
% puts stdout "[expr $x + $y]"
17
% puts stdout [expr $x + $y]
17
% puts stdout "$x + $y] = [expr {$x + $y}]"
8 + 9] = 17
% puts "\"(5-3)*4\" is : [expr (5-3)*4] "
"(5-3)*4" is : 8
不必要用双引号,为了显示“ ”,要加一个
二、 Tcl表达式和计算命令
2.1 tcl表达式
一个 Tcl 表达式由操作数、运算符和括号组成,在操作数和操作符以及括号之间可以用空格分开。表达式的操作数默认是十进制,也可以八进制(操作数第一个字符是 0)或者十六进制《操作数的前两个字符是 0x)。操作数可以是整数也可以是浮点数。表达式的运算待包括逻辑运算符和算术运算符,如表所示:
2.2 TCL内置函数
![在这里插入图片tps://img-blog.csdnimg.cn/beab58ed0cc940a2919ccec4bd013755.png#pic_center)
2.3 expr命令
在TCL中用expr命令分析和解释数学表达式。
格式:
expr arg1? aeg2?...?
示例1:
%set x 10
10
% set y 20
20
% set z [expr "$x + $y"]
30
% set z_label "$y plus $x is :"
20 plus 10 is :
% puts {z_lable [expr "$x + $y"]}
z_lable [expr "$x + $y"]
% puts "{z_lable [expr "$x + $y"]}"
{z_lable 30}
示例2:
puts "pi = [expr 2*asin(1)]"
pi = 3.141592653589793
示例3:
set x 10
10
set len [expr {[string length foobar] + $x}]
16
2.4 incr命令
incr根据步长增加或减少。
示例:
% set a 10
10
% incr a 2
12
% incr a -3
9
三、 Tcl字符串操作
TCL把所有的输入都当做字符串看待。
3.1 format命令
格式:
format formatsring arg1 ...argn
formatstring格式说明包含了位置说明、旗标、域宽、精确度、字符长度和转换字符等部分。formatstring由 \、字符和%field组成。%field 是字符串,以下面表格中的任意一个字符结束,这个字符说明了格式数据所对应的数据类型。
由于格式定义时经常使用空格,所以要用双引号或者大括号将定义括起来。
3.1.1 format 位置指示
格式:
数字$
#意思是直接取第几个参数的值,参数计算从1开始。
示例:
format {%2$s} a b c
format ”%2$s” a b c
b
% set str [format "%3\$s %1\$s %2\$s" "love" "y" "i"]
i love y
由于的置换作用,所以数字置换作用。
3.1.2 format 其他
格式化旗标、字符宽度、精度等。
- | 靠左对齐 |
+ | 显示数值正负号 |
– | – |
+ | 以0补满 |
# | 遇到O将前缀填入0遇到H添入0x |
示例:
% set name ford
ford
% set age 15
15
% set msg [format "%s is %5d years old" $name $age]
ford is 15 years old
% format "%#05x" 20
0x014
3.2 string命令
如果要把某个简单变量当做字符串处理/看待,可以用string命令提供的功能。option多达20个:
3.2.1 字符串长度、索引、范围
length 命令
返回字符串长度,空格、换行也算一个字符(需要” "引起来)。
格式1:
string length string1
示例:
string length "aa112 11"
8
index 命令
返回字符串中第charIndex个字符串.
格式:
string index string charIndex
#charIndex可以是下面的值:
#整数n : 第n个字符;
#end : 最后一个字符;
#end-整数n : 倒数第n个字符。
示例:
string index aabbccdd 3
b
range 命令
返回字符串中fist到last的距离。
示例:
string range aabbccdd 1 3
abb
3.2.2 字符串比较
compare命令
格式:
string compare ?-nocase? ?-length int? string1 string2
对两个字符串进行比较,如果他们严格(-exact)相等,返回0,如果第一个字符串在字典中先于第二个字符串,返回-1,否则返回1.。-length可以指定匹配的长度,即从第一位开始匹配多少位。
示例:
% string compare aaa123 bbb123
-1
% string compare bbb123 aaa123
1
% string compare aaa123 aaa123
0
match命令
格式:
string match ?-nocase? Pattern string
如果pattern匹配string,返回1,否则返回0;-nocase参数,不区分大小写。
示例:
string match *i* aaaiaaa
1
string match *[0-9] aaaiaa123
invalid command name "0-9"
#大括号括起来
string match {*[0-9]} aaaiaa123
1
string match -nocase {[a-z]*[0-9]} aaa123
1
equal 命令
格式:
string equal ?-nocase? ?-length int? string1 string2
对两个字符串进行比较,如果他们严格(-exact)相等,返回1,否则返回0,-length可以指定匹配的长度,即从第一位开始匹配多少位。
示例:
% string equal -length 12 aaabbb123 aaabbb123
1
% string equal -length 12 aaabbb123 aaaccc123
0
3.2.3 字符串大小写转化
tolower 命令
格式:
string tolower string ?first? ?last?
将first到last位置的字符串改小写。
示例 :
% string tolower AABBCCDD 1 5
AabbccDD
toupper 命令
格式:
string toupper string ?first? ?last?
将first到last位置的字符串改大写。
示例 :
string toupper aabccdd 1 5
aABCCDd
totitle 命令
格式:
string totitle string ?first? ?last?
将first到last位置的字符串改标题格式。
示例:
% string totitle aabccdd 1 5
aAbccdd
3.2.4 字符串剪裁
replace 命令
格式1:
string replace string fist last ?newstring?
使用newstring替换 fist到last位置的字符。如果newstring不存在,则将fist到last删除。如果fist比last大,则不替换。
示例:
% string replace aabbccdd 0 1 xx
xxbbccdd
% string replace aabbccdd 1 0 xx
aabbccdd
% string replace aabbccdd 0 1
bbccdd
map 命令
格式:
string map ?-nocase? mapping string
将string中出现的所有关键字都置换为响应值,置换按顺序进行的列表中先出现的关键字先处理。只对字符迭代一次,所以前面进行置换不会影响接下来的匹配查找。
示例:
% string map {aa AA} aabbccdd
AAbbccdd
% string map {aa AA bb BB cc CC} aabbccdd
AABBCCdd
trim 命令
格式:
string trim string ?chars?
将string开头和结尾出现的要剪裁的字符都删除。从两端开始,如果字符是a,则裁剪掉,这是针对字符,而不是字符串。
示例:
% string trim aabbccdd a
bbccdd
trimleft 命令
格式:
string trimleft string ?chars?
将string开头出现的要剪裁的字符都删除。同样针对字符。
示例:
% string trimleft a1abbccdd a
1abbccdd
trimright 命令
格式:
string trimright string ?chars?
将string结尾出现的要剪裁的字符都删除。同样针对字符。
示例:
% string trimright a1abbccd2d d
a1abbccd2
% string trimright a1abbccd2d 2
a1abbccd2d
3.2.5 字符串重复倒叙
repeat 命令
格式:
string repeat string count
将string重复cout次。
示例:
% string repeat string 2
stringstring
reverse 命令
格式:
string reverse string
将string顺序倒过来。
示例:
% string reverse string
gnirts
3.3 字符串匹配
字符串一个重要运算是宇符串的模式匹配。模式本身是字符串,这个字符串也称为正则表达式 (regular expression),它描述了待匹配子串的构成规则。例如,a*是一种模式,表示以a开始的任意长度任意字符的字符串。
TCL支持基于正则表达式的模式匹配机制,相对于string match 命令这种机制匹配更复杂,功能更强大。TCL中有两条显示支持正则表达式的匹配命令,其他命令的选择项中包含了-regexp 以支持正则表达式。
3.3.1、正则表达式:
可以按照下面的几个规则表达正规表达式:
^ : 匹配一个串的开始;
$ : 匹配一个串的结尾;
. : 匹配任意一个单字符;
* : 匹配任意多次*前的字符;
+ : 匹配任意多个,但是至少要有一次匹配+前的字符;
[...] : 匹配字符集合中的任意字符;
[^...] : 匹配任意不再^后所列的集合中的字符;
(...) : 把字符集合形成一个组。
在正则表达式中,* 符号匹配零个或者多个在 * 前的字符。例如a*,可以匹配a, aaaa 或者空串。如果在 * 是一个字符集合,通常用[ ]表示字符集合,那么 * 将匹配这个集合中任意数量的任意字符。例如,*[a-c]可以匹配 aa,abc, aabcbc,afg,cfg等任意字符、字符串或者空串。
**+符号的规则与 * 相同,但是它要求至少有一个字符匹配。例如,[a-c]**匹配至少包含 a,b,c一次的所有字符、字符串,但是不能是空串。
[^0-5a-g]可以匹配任意不包含 0-5或者a-g 的任意字符、字符串,不包含空串。
例如:
([A-Za-z]+) +([a-z]+) +[is]) 这个表达式的说明了一个字符串的构成规则:
1 第一个字符是A-Z 中的任意一个大写字母,第二个字符是a-z中任意一个小写字母,这种规则至少重复一次;
2 空格至少重复一次;
3 a-z中的小写字母任意可以至少重复一次;
4 空格至少重复一次
5 出现 is 字符串;
按照上面的规则,字待串 My classmate liming is a good student 是可以匹配这个规则的。
3.3.2、regexp 命令
格式:
regexp switches ? exp string ? matchVar ? ? subMatchl ...subMatchN?
这个命令必选的两个参数是exp 和string,其余的参数可选。regexp 命令在string 中搜索正规表达式exp,比较字符串 string 是否与 exp 部分或者全部匹配,如果匹配则返回1,否则返回 0。如果给出了参数 matchVar,那么将字符串中的子串拷贝到matchVar 中。按照自左向右的方式,subMatchVar 依次存放了和正则表达式exp中圆括号语法(子模式)相匹配的子字符串。
示例:
% set sample "Where there is a will, There is a way."
Where there is a will, There is a way.
% set result [regexp {[a-z]+} $sample match]
1
% puts "Result: $result; match: $match "
Result: 1; match: here
3.3.3、regsub 命令
基于正则表达式完成字符串匹配和替换…
格式:
regsub ? switches? exp string subSpec varName
在string中搜索匹配正规表达式exp 的子串,用subSpec 替换 string 中这些子串,并把结果拷贝到 varName 中。替换模式 subSpec包含有**&和\0**时,这些字符将被 string 中与 exp相匹配的子串替换,如果是\后面是数字 1-9,那么它们将被 **string 中与exp”()”**规则中相匹配的子串替换。
示例:
% set sample "She is a student."
She is a student.
% regsub "student" $sample "teacher" sample2
1
% puts "New: $sample2"
New: She is a teacher.