tcl三部曲(一)、替换、引用与匹配
Part01 前言
Tcl最早被称为工具命令语言,“Tool command language”,是一种脚本语言。
Part02 替换
Tcl共有三种替换方式:替换变量$、命令替换[]和反斜杠替换\。
Tcl解析器在解析命令的时候,并不会为其中的单词赋予任何含义,这些单词的含义取决于具体的命令执行过程(important)。
Tcl解释器在执行命令过程之前完成这些替换。
替换变量:$
变量替换由$触发,$此处表示调用,$将Tcl变量的值插入单词中,如下所示:
上述例子需要说明的是tcl脚本包含一条或者多条命令,命令通过换行符或者分号隔开,上述example等价于:
每条命令都包含一个或多个单词,第一个单词是命令名,其他参数都是命令的参数,例如“set a 1”中:set是命令名,a和1是参数。
一条命令中可以含有任意多个单词,每个单词都可以是任意的字符串值,分隔单词的空白不是单词的一部分,分隔命令的换行符也不是单词的一部分。
$引用的变量名由字母数字和下划线构成,遇到非数字、字母、下划线就会停止,并不是说变量名中不可以含有其他字符,在含有其他字符时需要用{}进行引用表示这是一个整体。
命令替换:[]
命令替换使用[]表示,用[]括起来就当做一个命令去处理,[]返回的值就是命令执行的一个结果。
下例中使用incr指令进行说明,aa为参数名,$bb为要+的整数,[expression]的返回值为相加的和(运行环境为DC):
再以一个glob查找操作进行说明(运行环境:vivado):
在上例中,file delete [glob *.v]的目的是删除所有的.v文件,但是会删除失败,因为[glob*.v]返回参数{a.v b.vc.v}会被当做一个整体,Tcl工具在解释时并不会返回的单词赋值任何内容,只是当做一个字符串看待。
“man glob”查看glob详细说明:
glob返回的是一个列表形式的返回值,类似于一个数组,当直接使用filedelete [glob *.v]进行删除时会失败是因为此时操作的对象是list的地址,而非list中的多个元素,所以使用{*}对列表的地址进行解析,解析得到的结果为各个元素,此时删除操作就会成功。
上述想法的支撑在于对于仅有一个删除对象的验证,此时元素的地址与list的首地址相同(类似C语言中的数组和元素),此时file delete [glob *.v]就会删除成功:
为了删除所有.v文件,需要在[glob*.v]前加上{*}修饰符,告诉Tcl解析工具以空格为界解析文件名。
反斜杠替换\
Part03引用(*强弱引用)
定义:Tcl语言中提供一些方法,阻止解析器对$和分号等特殊字符进行特殊处理,常见的引用包括:1、反斜杠\ 2、双引号”” 3、大括号{}
反斜杠\
反斜杠\可以阻止调用$的转换,将调用$解析成字符串$。
强引用和弱引用
如下说明:
此外,如果一行命令太长,在一行的末尾使用“\”告诉Tcl解析器一行未结束,如下所示:
再来个简单相似版的
在上例中需要注意的是for循环的格式(man for查看):
为什么{}中的强引用不被当做字符处理?
也当了。
大括号最重要的一个功能就是“延期处理”,延期处理时特殊字符被当做参数传递给命令过程,命令过程自己处理处理这些特殊字符,实际上命令过程也是拿到这些特殊字符后给Tcl解释器处理,例如:
统计在列表中某个特定值出现的次数:
整个过程块都在大括号中,他会原封不动的传递给proc,在解析proc命令时变量list的值不会被替换进来。在每次调用这个过程时$list都需要读入不同的值。
把里面的内容作为一个单词传递给命令过程,之后命令过程在根据命令参数再去解析这个单词中的内容。
Part04三种匹配方式
Tcl中存在三种匹配方式:exact、glob、正则表达式。
exact和glob
exact就是严格匹配,即两个字符串必须完全相同,不允许通配符的出现。
正则表达式
感谢公众号《IC小迷弟》提供的视频讲解与学习资源!推送内容是对视频讲解的部分整理,关于详细内容,大家可以关注IC小迷弟获取全部学习资料(讲解视频连接:tcl语言基础培训)。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
长按识别图中二维码关注