这里写目录标题

  • 一、 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语言中命令与参数都是以空格隔开的,所以字符串中有空格时要用” ”或{ }括起来。

tcl脚本语言 echo_字符串

1.2 TCL脚本文件和Sourse命令

Tcl命令可以单条命令执行,也可以把多条命令形成一个脚本文件,通过source命令执行。

格式:
%source *.tcl

示例:
source test.tcl

tcl脚本语言 echo_tcl脚本语言 echo_02

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

tcl脚本语言 echo_tcl脚本语言 echo_03

1.3.2 替换

Tcl中包含三种变量替换方式:变量替换、命令替换[]、反斜杠替换。

$替换

tcl脚本语言 echo_unix_04

示例:
% set a 1
1
% set b $a
1
% puts "b = $b"
b = 1

tcl脚本语言 echo_服务器_05


[]替换

示例:
% set a [expr 1 + 2]
3

tcl脚本语言 echo_服务器_06

\替换

tcl脚本语言 echo_tcl脚本语言 echo_07


tcl脚本语言 echo_tcl脚本语言 echo_08

示例:
% set a \$;
$
% set b $a;
$
#\后不要跟空格。

tcl脚本语言 echo_tcl脚本语言 echo_09


特殊替换:

如下图所示,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

tcl脚本语言 echo_tcl脚本语言 echo_10

1.4 引用

Tcl语言提供了一些方法,阻止解析器对$和分号等特殊字符进行处理,这些方法称之为引用。常用的引用包括:

反斜杠 \ ,双引号 ” ”和大括号 { } 。

反斜杠在替换中已经介绍过了,其余两种如下:

tcl脚本语言 echo_linux_11

示例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

tcl脚本语言 echo_tcl脚本语言 echo_12

示例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 的格式。

tcl脚本语言 echo_tcl脚本语言 echo_13

示例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脚本语言 echo_服务器_14

二、 Tcl表达式和计算命令

2.1 tcl表达式

一个 Tcl 表达式由操作数、运算符和括号组成,在操作数和操作符以及括号之间可以用空格分开。表达式的操作数默认是十进制,也可以八进制(操作数第一个字符是 0)或者十六进制《操作数的前两个字符是 0x)。操作数可以是整数也可以是浮点数。表达式的运算待包括逻辑运算符和算术运算符,如表所示:

tcl脚本语言 echo_unix_15


tcl脚本语言 echo_字符串_16


tcl脚本语言 echo_linux_17


tcl脚本语言 echo_服务器_18


tcl脚本语言 echo_linux_19

2.2 TCL内置函数

![在这里插入图片tps://img-blog.csdnimg.cn/beab58ed0cc940a2919ccec4bd013755.png#pic_center)

tcl脚本语言 echo_linux_20

tcl脚本语言 echo_服务器_21

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}

tcl脚本语言 echo_linux_22

示例2:
puts "pi = [expr 2*asin(1)]"
pi = 3.141592653589793

tcl脚本语言 echo_tcl脚本语言 echo_23

示例3:
set x 10
10
set len [expr {[string length foobar] + $x}]
16

tcl脚本语言 echo_服务器_24

2.4 incr命令

incr根据步长增加或减少。

示例:
% set a 10
10
% incr a 2
12
% incr a -3
9

tcl脚本语言 echo_linux_25

三、 Tcl字符串操作

TCL把所有的输入都当做字符串看待。

3.1 format命令

格式:
format formatsring arg1 ...argn

formatstring格式说明包含了位置说明、旗标、域宽、精确度、字符长度和转换字符等部分。formatstring由 \、字符和%field组成。%field 是字符串,以下面表格中的任意一个字符结束,这个字符说明了格式数据所对应的数据类型。

由于格式定义时经常使用空格,所以要用双引号或者大括号将定义括起来。

tcl脚本语言 echo_linux_26

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

由于tcl脚本语言 echo_服务器_27的置换作用,所以数字tcl脚本语言 echo_linux_28置换作用。

tcl脚本语言 echo_tcl脚本语言 echo_29

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

tcl脚本语言 echo_linux_30

3.2 string命令

如果要把某个简单变量当做字符串处理/看待,可以用string命令提供的功能。option多达20个:

tcl脚本语言 echo_服务器_31

3.2.1 字符串长度、索引、范围

length 命令

返回字符串长度,空格、换行也算一个字符(需要” "引起来)。

格式1:
string length string1
示例:
string length "aa112 11"
8

tcl脚本语言 echo_服务器_32

index 命令

返回字符串中第charIndex个字符串.

格式:
string index string charIndex
#charIndex可以是下面的值:
#整数n			:		第n个字符;
#end 			:		最后一个字符;
#end-整数n		:		倒数第n个字符。

示例:
string index aabbccdd 3
b

tcl脚本语言 echo_服务器_33

range 命令

返回字符串中fist到last的距离。

示例:
string range aabbccdd 1 3
abb

tcl脚本语言 echo_服务器_34

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

tcl脚本语言 echo_tcl脚本语言 echo_35

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

tcl脚本语言 echo_字符串_36

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

tcl脚本语言 echo_服务器_37

3.2.3 字符串大小写转化

tolower 命令
格式:
string tolower string ?first? ?last?

将first到last位置的字符串改小写。

示例 :
% string tolower AABBCCDD 1 5
AabbccDD

tcl脚本语言 echo_linux_38

toupper 命令
格式:
string toupper string ?first? ?last?

将first到last位置的字符串改大写。

示例 :
string toupper aabccdd 1 5
aABCCDd

tcl脚本语言 echo_服务器_39

totitle 命令
格式:
string totitle string ?first? ?last?

将first到last位置的字符串改标题格式。

示例:
% string totitle aabccdd 1 5
aAbccdd

tcl脚本语言 echo_tcl脚本语言 echo_40

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

tcl脚本语言 echo_unix_41

map 命令
格式:
string map ?-nocase? mapping string

将string中出现的所有关键字都置换为响应值,置换按顺序进行的列表中先出现的关键字先处理。只对字符迭代一次,所以前面进行置换不会影响接下来的匹配查找。

示例:
% string map {aa AA} aabbccdd
AAbbccdd
% string map {aa AA bb BB cc CC} aabbccdd
AABBCCdd

tcl脚本语言 echo_字符串_42

trim 命令
格式:
string trim string ?chars?

将string开头和结尾出现的要剪裁的字符都删除。从两端开始,如果字符是a,则裁剪掉,这是针对字符,而不是字符串。

示例:
% string trim aabbccdd a
bbccdd

tcl脚本语言 echo_tcl脚本语言 echo_43

trimleft 命令
格式:
string trimleft string ?chars?

将string开头出现的要剪裁的字符都删除。同样针对字符。

示例:
% string trimleft a1abbccdd a
1abbccdd

tcl脚本语言 echo_linux_44

trimright 命令
格式: 
string trimright string ?chars?

将string结尾出现的要剪裁的字符都删除。同样针对字符。

示例:
% string trimright a1abbccd2d d
a1abbccd2
% string trimright a1abbccd2d 2
a1abbccd2d

tcl脚本语言 echo_linux_45

3.2.5 字符串重复倒叙

repeat 命令
格式:
string repeat string count

将string重复cout次。

示例:
% string repeat string  2
stringstring

tcl脚本语言 echo_服务器_46

reverse 命令
格式:
string reverse string

将string顺序倒过来。

示例:
% string reverse string
gnirts

tcl脚本语言 echo_服务器_47

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?

这个命令必选的两个参数是expstring,其余的参数可选。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

tcl脚本语言 echo_unix_48

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.

tcl脚本语言 echo_unix_49