前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tcl三部曲(一)、替换、引用与匹配

tcl三部曲(一)、替换、引用与匹配

作者头像
根究FPGA
发布2020-08-13 14:30:57
3.6K0
发布2020-08-13 14:30:57
举报
文章被收录于专栏:根究FPGA根究FPGA

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就是严格匹配,即两个字符串必须完全相同,不允许通配符的出现。

正则表达式

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 根究FPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 替换变量:$
  • 命令替换:[]
  • 反斜杠替换\
  • Part03引用(*强弱引用)
    • 反斜杠\
      • 强引用和弱引用
        • 为什么{}中的强引用不被当做字符处理?
        • Part04三种匹配方式
          • exact和glob
            • 正则表达式
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档