前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入理解Tcl中的置换

深入理解Tcl中的置换

作者头像
Lauren的FPGA
发布于 2019-10-31 05:07:20
发布于 2019-10-31 05:07:20
1.6K0
举报
文章被收录于专栏:Lauren的FPGALauren的FPGA

Tcl语言中有三类置换:变量置换(点击这里复习:变量置换)、命令置换(点击这里复习:命令置换)和反斜杠置换(点击这里复习:反斜杠置换)。可以说“置换”是Tcl的灵魂,同时也是让初学者容易感到困惑的一个难点。很多初学者常会碰到这样的情形:不希望发生置换时却发生了或者希望发生置换时却没有发生,加之一些Tcl解释器调试功能欠佳,往往让初学者受挫,觉得自己的脚本发生了诡异的行为。实际上,Tcl的置换机制很简单,其行为也很容易预测,只需记住如下两条规则:

规则1:Tcl在解析一条命令时,只从左向右解析一次,进行一轮置换,每一个字符只会被扫描一次;

规则2:每一个字符只会发生一层置换,而不会对置换后的结果再进行一次扫描置换

看一个典型的例子,在这个例子中,变量x被赋值为10,变量a被赋值为字符x。之后,给变量b赋值$$a。根据上述规则,Tcl从左向右对命令”set b $$a”进行解析,扫描所有的字符,发现$$a时,执行变量置换,得到$x,同时只发生一层置换,不会对置换后的结果$x再进行扫描置换(否则$$a中最左侧也就是第一个$将被扫描两次,与规则1冲突,)。因此,最左侧的$并不会触发变量置换,最终变量b的值将会是$x,而不是10。

根据上述两个规则,理解如下脚本的执行结果。

从Tcl代码风格的角度看,应尽可能地将置换简单化,这意味着尽可能地将多层次嵌套的置换分解为更简单的层次置换,这可通过命令分解实现。同时避免在同一条命令中出现太多的置换,尤其避免出现太多复杂的不同类型的置换,这对代码维护十分不利。此外,值得考虑的方法是建立“过程”,将复杂的操作隔离开来,从而增强代码的可读性和可维护性。看这样一个例子,计算两个字符串的总长度,这里用到了三个命令:set、expr和stringlength。在计算str_len时,使用了变量置换和命令置换,同时出现了命令嵌套。

对比另一种写法,将嵌套拆分,代码的可读性便跃然纸上。

结论:

Tcl在解析一条命令时

-每个字符只会被扫描一次

-每个字符只会发生一层置换

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tcl之$$a 80%的概率......
看一个典型的例子,如下图所示。变量x被赋值为10,变量a被赋值为字符x。之后,给变量b赋值$a。最终变量b的值将会是x,而不是10。
Lauren的FPGA
2020/08/25
2.6K0
Tcl之$$a 80%的概率......
Shell反引号、$()和${}的区别
反引号和$()的作用相同,用于命令替换(command substitution),即完成引用的命令的执行,将其结果替换出来,与变量替换差不多。比如:
恋喵大鲤鱼
2019/03/05
9.8K2
惊!\u202a错误,百分之九十都不知道的隐藏在文件路径里的惊天秘密!(干货收藏)
然后上网查了一下发现很多小伙伴都经历过类似的问题,网上的回答也有很多,但是大部分都是说在路径字符串前加r变成原始字符串、或者手动输入路径字符串进行解决。
灰小猿
2020/09/23
6.7K0
惊!\u202a错误,百分之九十都不知道的隐藏在文件路径里的惊天秘密!(干货收藏)
命令置换
命令置换是Tcl的第二种置换形式。该置换以方括号[]形式体现。方括号中是另外一个Tcl命令。从这个角度而言,这实际上就是命令的嵌套。命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所代替。如下图所示。命令expr会在解析set的单词时执行,expr的结果即字符串16成为命令set的第二个参数。
Lauren的FPGA
2019/10/31
6200
c语言每日一练(3)
A.n(n+2)/2 B.(n-1)(n+2)/2 C.n(n+1)/2 D.(n-1)(n+2)
大海里的番茄
2024/01/19
1370
c语言每日一练(3)
tcl三部曲(一)、替换、引用与匹配
Tcl最早被称为工具命令语言,“Tool command language”,是一种脚本语言。
根究FPGA
2020/08/13
4K0
tcl三部曲(一)、替换、引用与匹配
tcl三部曲(二)、变量与列表
1、 无需声明定义,直接使用set进行创建,使用unset进行移除,变量包含变量名和变量值两部分。
根究FPGA
2020/08/18
2K0
tcl三部曲(二)、变量与列表
【C语言入门】C语言入门:探索编程世界的基础概念
前言: 在数字化时代的浪潮中,编程已经成为一项不可或缺的技能。C语言,作为计算机编程的基石之一,以其高效、灵活和强大的特性,吸引着无数初学者和开发者。 无论你是对计算机科学充满好奇的学生,还是希望提升个人技能的职场人士,掌握C语言都将为你打开一扇通往编程世界的大门。
Eternity._
2024/07/02
3720
【C语言入门】C语言入门:探索编程世界的基础概念
TCL语法_日语语法整理手写笔记
Tcl 全称是 Tool command Language。它是一个基于字符串的命令语言,基础结构和语法非常简单,易于学习和掌握。
全栈程序员站长
2022/09/20
7180
Java程序设计(Java9版):第2章 数据类型与运算符(Data types and Operators)
第2章 数据类型与运算符(Data types and Operators) I think everybody in this country should learn how
程裕强
2018/01/02
1.3K0
Java程序设计(Java9版):第2章 数据类型与运算符(Data types and Operators)
Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化
所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串。如在字符串 "ABCDEFG" 中查找是否存在 “EF” 字符串。
一枚大果壳
2022/08/23
6710
Python  细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化
享学课堂谈-Python程序员的常见错误
这些是Python初学者活生生犯的错,千百次的错。事实上,这些错误实在是太普遍了以至于我敢保证你刚开始学的时候是一定会犯的。 “那么是什么呢?”你会问,“你也会在Python里犯那么多错么?”是的。Python可能是最简单、最灵活的语言之一,但它终究还是一门编程语言。它仍然有语法,数据类型,以及巫师蒂姆居住的黑暗角落。 (典故出自《蒙蒂派森与圣杯》中的魔法师蒂姆,他主角们指点在洞穴的墙壁上记录的圣杯位置,作者在此处的意思是Python语言里容易犯错的地方。另,Python语言得名于作者Guido van R
企鹅号小编
2018/01/25
9170
深入理解java中的static关键字
static关键字是摆在刚入行编程语言的小白们面前的一道难题,为什么要用static?使用它有什么好处?修饰方法和修饰变量有什么区别?本文将就java中static关键字的使用方法及注意事项进行深入探讨,一是为了方便自己以后查阅,二也为了与大家交流分享学习的经验。
用户7886150
2020/12/13
1.8K0
python3学习笔记(1)----基
2、标识符的第一个字母必须是字母(大小写字母)或者下划线,其他部分可以有字母和下划线和数字组成。 3、标识符名称对大小写敏感,例如myname和myName是不一样的。 4、python的注释:单行语句用#注释、也可以用三个单引号或者三个双引号、'''要注释的内容'''、"""要注释的内容"""。 5、多行语句:Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠()来实现多行语句,例如:
py3study
2020/01/02
7290
Python语言笔记
标识符 第一个字符必须是字母表中字母或下划线'_'。 标识符的其他的部分有字母、数字和下划线组成。 标识符对大小写敏感。
py3study
2020/01/14
1.4K0
正则表达式基础
基本语法 基本语法_菜鸟教程 用\表示特殊形式或允许使用特殊字符,而不调用其特殊含义 不以任何特殊方式在字符串字面值中以'r'前缀处理反斜杠 所以r'\n'包含'\'和'n'两个字符,而'\n'
JNJYan
2019/01/18
7670
优秀攻城师必知的正则表达式语法
最近公司的一个项目,大量用到了正则来处理文本,以前对正则使用仅限于小打小闹,用的也是一知半解,经过本次的深入使用,发现正则表达式真的是每一位开发者都需要具备的一个基础技能,处理文本的功能异常强大。今天我们就来系统的学习一下它。
我是攻城师
2019/08/05
1.3K0
优秀攻城师必知的正则表达式语法
注释与续行
Tcl中的注释符为井号#,但井号#的位置是有所讲究的,即它必须位于命令的第一个字符。从这个角度而言,Tcl的注释和命令处于同一层次,这意味着一个注释要占用一个命令位置。看一个简单的例子。在这个例子中,第一条注释独自占据一行并以#开始,因此该注释是合法的;第二条注释尽管和set命令在同一行,但set命令后紧随分号,表明命令结束,故该注释也是合法的;第三条注释中,#出现在set命令中间,并不是命令的第一个字符,而被当做set命令的一部分,从而造成set命令参数设置不合理。
Lauren的FPGA
2019/10/31
1.1K0
双引号与花括号
在Tcl中,可通过双引号“”和花括号{}将多个单词包括分隔符(例如:换行符和空格)和置换符(例如:美元符号$、方括号[]和反斜杠)等特殊字符组成一组,作为一个参数处理。这实际上也是一种置换操作。区别在于双引号内的置换正常进行,而花括号内的置换有可能会被阻止,如下图所示。变量s被赋值为Hello World,注意这里通过双引号避免了空格被当作分隔符处理。第一个puts命令使用了双引号,可以看到所有置换都随之发生;第二个puts命令使用了花括号,相应的内部置换均被阻止。
Lauren的FPGA
2019/10/31
2.4K0
python3学习笔记(2)----p
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号(=)用来给变量赋值。 等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:
py3study
2020/01/02
9320
相关推荐
Tcl之$$a 80%的概率......
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档