脚本、命令和单词:在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。
图1
上面这个例子说明在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中常用于过程定义和命令流控制,关于过程定义和命令流控制在以后学习中详细说明。
用户1504897 2011-8-13 14:57