本帖最后由 i电子 于 2012-8-28 11:19 编辑
脚本、命令和单词:在TCL中,这三个概念是从外到内的包含关系,一个脚本文件中可以包含一条或者多条命令,一个命令由由一个或者多个单词组成。举个例子吧,如一下几行代码,整个就是一个脚本文件,其中有三条命令,分隔两条命令可以用回车换行或者分号,在命令中有几个单词,如第一条命令,set是第一个单词,它是一个命令名,而a和9分别为第二和第三个单词,它们是set的两个参数,因此不管是命令名还是参数都属于单词,单词之间用空格符分隔。 set a 9 set b 16 ;set c 25 替换:在TCL中有三种替换形式:变量替换、命令替换和反斜线替换。 (1) 变量替换:首先看一个程序: set a 9 set b a 大家猜想一下,a 和b 的值,a 的值一目了然,肯定是9 ,关键是b ,b 的值会是9 吗?那我们来验证一下,如图1 所示,a 的值没问题,b 的值显示是a 。
上面这个例子说明在TCL 中间接赋值是行不通的,仔细研究可以发现,在第一条命令中a 是一个变量,而在第二条命令中a 只是一个字符,那有什么办法能做到间接赋值呢?采用变量替换,可以将TCL 变量的值插入单词中,如图2 所示例子,在a 前面加上变量替换符$ ,就可以取出变量a 的值,此处a 不再是一个字符,而是一个变量。
图2 (2) 命令替换:一个单词可由变量的值替换,其实也可以由一个命令替换,这种替换称为命令替换,替换符为方括号[ ],如图3中命令,第二条命令中的第三个单词由一条命令替换而成,其中expr这个命令返回表达式$a*4的值,而a的值为2,因此计算得到b的值是8。
图3 (3) 反斜线替换:一个单词替换成一些特殊的字符,替换符为反斜杠\,这个与C语言中有些相似,比如\n表示回车换行,\t表示制表符,应该很容易理解。 引用:在TCL中,有类似替换符$、[]这样的特殊字符,TCL解析器需要对它们进行特殊处理,但如果想让这些字符按照正常的字符一样输出,则需要引用,引用并不限定于阻止解析器对特殊字符的处理,类似这种阻止解析器的特殊处理的方式都称为引用。在TCL中有两种引用形式:双引号引用和大括号引用。其中大括号引用取消所有特殊字符的特殊处理,双引号引用取消单词分隔符和命令分隔符的特殊处理。 (1) 双引号引用:如上所述,双引号引用可以取消单词分隔符和命令分隔符的特殊处理,单词分隔符就是空格,命令分隔符是换行或分号。如图4所示,第一条命令中,a、b之间的空格被忽略;第二条命令中,a、b之间的分号和b、c之间的换行被忽略。
图4 双引号有两个注意:在TCL中,如果检测到一个单词的第一个字符是引号“,则表示引用开始,直到检测到另一个引号”表示结束,因此如果调用双引号引用,引号“必须作为第一个字符。 另外一个注意就是双引号引用并不会取消特殊字符的处理,如图5所示。
图5 (2) 大括号引用:取消所有特殊字符的处理。如图6所示, 图6 其实大括号引用的功能包含了双引号引用的功能,图6例子中,空格的特殊处理也被取消了。 此外,大括号引号还可以嵌套使用,与C语言中的大括号功能类似,就是将多条命令包起来,表示这些命令是一个整体。在TCL中常用于过程定义和命令流控制,关于过程定义和命令流控制在以后学习中详细说明。
|