logo资料库

TCL培训教程(全).pdf

第1页 / 共66页
第2页 / 共66页
第3页 / 共66页
第4页 / 共66页
第5页 / 共66页
第6页 / 共66页
第7页 / 共66页
第8页 / 共66页
资料共66页,剩余部分请下载后查看
关键词:TCL TCL培训教程(全) 摘 要:本文是TCL教材的第三稿,前两稿分别是《TCL的使用》和《TCL培训教程》。这 一稿加入了不少内容,是北研TCL兴趣小组共同努力的结果。本文详细介绍了TCL 的各个方面,特别对利用C\C++语言扩展TCL命令作了详细论述。本文附有大量实 例。 缩略语清单: TCL Tool Command Language 一种脚本语言 参考资料清单: 请在表格中罗列本文档所引用的有关参考文献名称、作者、标题、编号、发布日期 和出版单位等基本信息。 名称 作者 编号 发布日期 查阅地点或 渠道 参考资料清单 Tcl and Tk ToolKit John K.Ousterhout 981-235- 951-6 1999 自己的图 书 TCL的使用 陈旭盛 TCL培训教程 陈旭盛 自写文档 自写文档 出版单位(若不 为本公司发布的 文献,请填写此 列) Addison Wesley Publishing Commpany 1 引言 TCL(Tool Command Language)是一种解释执行的脚本语言(Scripting Language)。 它提供了通用的 编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。 由于TCL的解释器是用一个C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看 作一个C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,可以很容易就在C\C++应用程 序中嵌入TCL,而且每个应用程序都可以根据自己的需要对TCL语言进行扩展。我们可以针对某一特 定应用领域对TCL语言的核心命令集进行扩展,加入适合于自己的应用领域的扩展命令,如果需要, 甚至可以加入新的控制结构,TCL解释器将把扩展命令和扩展控制结构与固有命令和固有控制结构同 等看待。扩展后的TCL语言将可以继承TCL 核心部分的所有功能,包括核心命令、控制结构、数据类
型、对过程的支持等。根据需要,我们甚至可以屏蔽掉TCL的某些固有命令和固有控制结构。通过对 TCL的扩展、继承或屏蔽,用户用不着象平时定义一种计算机语言那样对词法、语法、语义、语用等 各方面加以定义,就可以方便的为自己的应用领域提供一种功能完备的脚本语言。 TCL良好的可扩展性使得它能很好地适应产品测试的需要,测试任务常常会由于设计和需求的改 变而迅速改变,往往让测试人员疲于应付。利用TCL的可扩展性,测试人员就可以迅速继承多种新技 术,并针对产品新特点迅速推出扩展TCL命令集,以用于产品的测试中,可以较容易跟上设计需求的 变化。 另外,因为TCL是一种比C\C++ 语言有着更高抽象层次的语言,使用TCL可以在一种更高的层次 上编写程序,它屏蔽掉了编写C\C++程序时必须涉及到的一些较为烦琐的细节,可以大大地提高开发 测试例的速度。而且, 使用TCL语言写的测试例脚本,即使作了修改,也用不着重新编译就可以调用 TCL解释器直接执行。可以省却不少时间。 TCL 目前已成为自动测试中事实上的标准。 2 语法 简单的讲,TCL语言的语法实际上是一些TCL解释器怎样对TCL命令进行分析的规则的集合。 2.1 脚本、命令和单词符号 一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都 是合法的: set a 1 set b 2 或 set a 1;set b 2 TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参 数,单词之间必须用空格或TAB键隔开。 TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL 解释器运用规则 把命令分成一个个独立的单词,同时进行必要的置换(substitution); 在执行阶段,TCL 解释器会把第 一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程, 并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。 2.2 置换(substitution) 2011-09-01 版权所有,侵权必究 第2页,共66页
注:在下面的所有章节的例子中,'%'为TCL的命令提示符,输入命令回车后,TCL会在接着的一 行输出命令执行结果。'//'后面是我自己加上的说明,不是例子的一部分。 TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如: %set x 10 //定义变量x,并把x的值赋为10 10 %set y x+100 //y的值是x+100,而不是我们期望的110 x+100 上例的第二个命令中,x被看作字符串x+100的一部分,如果我们想使用x的值'10' ,就必须告诉 TCL解释器:我们在这里期望的是变量x的值,而非字符'x'。怎么告诉TCL解释器呢,这就要用到TCL 语言中提供的置换功能。 TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单 词本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。 2.2.1 变量置换(variable subtitution) 变量置换由一个$符号标记,变量置换会导致变量的值插入一个单词中。例如: %set y $x+100 //y的值是10+100,这里x被置换成它的值10 10+100 这时,y的值还不是我们想要的值110,而是10+100,因为TCL解释器把10+100看成是一个字符串 而不是表达式,y要想得到值110,还必须用命令置换,使得TCL会把10+100看成一个表达式并求值。 2.2.2 命令置换(command substitution) 命令置换是由[]括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被另 一个命令的结果所代替。例如: %set y [expr $x+100] 110 y的值是110,这里当TCL解释器遇到字符'['时,它就会把随后的expr作为一个命令名,从而激活与 expr对应的C/C++过程,并把'expr'和变量置换后得到的'10+110'传递给该命令过程进行处理。 如果在上例中我们去掉[],那么TCL会报错。因为在正常情况下,TCL解释器只把命令行中的第 一个单词作为看作命令,其他的单词都作为普通字符串处理,看作是命令的参数。 注意,[]中必须是一个合法的TCL脚本,长度不限。[]中脚本的值为最后一个命令的返回值,例 如: %set y [expr $x+100;set b 300] //y的值为300,因为set b 300的返回值为300 300 2011-09-01 版权所有,侵权必究 第3页,共66页
有了命令置换,实际上就表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参 数。 2.2.3 反斜杠置换(backslash substitution) TCL语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行 符、空格、[、$等被TCL解释器当作特殊符号对待的字符。例如: set msg multiple\ space //msg的值为multiple space。 如果没有'\'的话,TCL会报错,因为解释器会把这里最后两个单词之间的空格认为是分隔符,于 是发现set命令有多于两个参数,从而报错。加入了'\'后,空格不被当作分隔符,'multiple space'被认为 是一个单词(word)。又例如: %set msg money\ \$3333\ \nArray\ a\[2] //这个命令的执行结果为:money $3333 Array a[2] 这里的$不再被当作变量置换符。 TCL支持以下的反斜杠置换: Backslash Sequence Replaced By \a \b \f \n \r \t \v \ddd \xhh \ newline space Audible alert (0x7) Backspace (0x8) Form feed (0xc) Newline (0xa) Carriage return (0xd) Tab (0x9) Vertical tab (0xb) Octal value given by ddd (one, two, or three d's) Hex value given by hh (any number of h's) A single space character. 例如: %set a \x48 //对应 \xhh H //十六进制的48正好是72,对应H % set a \110 //对应 \ddd H //八进制的110正好是72,对应H 2011-09-01 版权所有,侵权必究 第4页,共66页
%set a [expr \ // 对应\newline space,一个命令可以用\newline转到下一行继续 2+3] 5 2.2.4 双引号和花括号 除了使用反斜杠外,TCL提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通 字符,而不作特殊处理,这就要使用双引号和花括号({})。 TCL解释器对双引号中的各种分隔符将不作处理,但是对换行符 及$和[]两种置换符会照常处 理。例如: %set x 100 100 %set y "$x ddd" 100 ddd 而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作特殊 处理。 %set y {/n$x [expr 10+100]} /n$x [expr 10+100] 2.3 注释 TCL中的注释符是'#','#'和直到所在行结尾的所有字符都被TCL看作注释,TCL解释器对注释将 不作任何处理。不过,要注意的是,'#'必须出现在TCL解释器期望命令的第一个字符出现的地方,才 被当作注释。 例如: %#This is a comment %set a 100 # Not a comment wrong # args: should be "set varName ?newValue?" %set b 101 ; # this is a comment 101 第二行中'#'就不被当作注释符,因为它出现在命令的中间,TCL解释器把它和后面的字符当作命 令的参数处理,从而导致错误。而第四行的'#'就被作为注释,因为前一个命令已经用一个分号结束, TCL解释器期望下一个命令接着出现。现在在这个位置出现'#',随后的字符就被当作注释了。 3 变量 TCL支持两种类型的变量:简单变量和数组。 2011-09-01 版权所有,侵权必究 第5页,共66页
3.1 简单变量 一个TCL的简单变量包含两个部分:名字和值。名字和值都可以是任意字符串。例如 一 个 名 为 “1323 7&*: hdgg" 的 变 量 在 TCL 中 都 是 合 法 的 。 不 过 为 了 更 好 的 使 用 置 换 (substitution),变量名最好按C\C++语言中标识符的命名规则命名。 TCL解释器在分析一个变 量置换时,只把从$符号往后直到第一个不是字母、数字或下划线的字符之间的单词符号 作为要被置换的变量的名字。例如: % set a 2 2 set a.1 4 4 % set b $a.1 2.1 在最后一个命令行,我们希望把变量a.1的值付给b,但是TCL解释器在分析时只把$符号之后直到 第一个不是字母、数字或下划线的字符(这里是'.')之间的单词符号(这里是'a')当作要被置换的变量 的名字,所以TCL解释器把a置换成2,然后把字符串“2.1”付给变量b。这显然与我们的初衷不同。 当然,如果变量名中有不是字母、数字或下划线的字符,又要用置换,可以用花括号 把变量名括起来。例如: %set b ${a.1} 4 TCL中的set命令能生成一个变量、也能读取或改变一个变量的值。例如: % set a {kdfj kjdf} kdfj kjdf 如果变量a还没有定义,这个命令将生成 变量a,并将其值置为kdfj kjdf,若a已定义, 就简单的把a的值置为kdfj kjdf。 %set a kdfj kjdf 这个只有一个参数的set命令读取a的当前值kdfj kjdf。 3.2 数组 2011-09-01 版权所有,侵权必究 第6页,共66页
数组是一些元素的集合。TCL的数组和普通计算机语言中的数组有很大的区别。在TCL中,不能单 独声明一个数组,数组只能和数组元素一起声明。数组中,数组元素的名字包含两部分:数组名和数 组中元素的名字,TCL中数组元素的名字(下标〕可以为任何字符串。例如: set day(monday) 1 set day(tuesday) 2 第一个命令生成一个名为day的数组,同时在数组中生成一个名为monday的数组元 素,并把值置为1,第二个命令生成一个名为tuesday的数组元素,并把值置为2。 简单变量的置换已经在前一节讨论过,这里讲一下数组元素的置换。除了有括号之 外,数组元素的置换和简单变量类似。例: set a monday set day(monday) 1 set b $day(monday) //b的值为1,即day(monday)的值。 set c $day($a) //c的值为1,即day(monday)的值。 TCL不能支持复杂的数据类型,这是一个很大的缺憾,也是TCL受指责很多的方面。但是TCL的一个 扩展ITCL填补了这个缺憾。 3.3 相关命令 3.3.1 set 这个命令在3.1已有详细介绍。 3.3.2 unset 这个命令从解释器中删除变量,它后面可以有任意多个参数,每个参数是一个变量名,可以是简 单变量,也可以是数组或数组元素。例如: % unset a b day(monday) 上面的语句中删除了变量a、b和数组元素day(monday),但是数组day并没有删除,其他元素还存 在,要删除整个数组,只需给出数组的名字。例如: %puts $day(monday) can't read "day(monday)": no such element in array % puts $day(tuesday) 2 %unset day % puts $day(tuesday) 2011-09-01 版权所有,侵权必究 第7页,共66页
can't read "day(tuesday)": no such variable 3.3.3 append和incr 这两个命令提供了改变变量的值的简单手段。 append命令把文本加到一个变量的后面,例如: % set txt hello hello % append txt "! How are you" hello! How are you incr命令把一个变量值加上一个整数。incr要求变量原来的值和新加的值都必须是整数。 %set b a a % incr b expected integer but got "a" %set b 2 2 %incr b 3 5 4 表达式 TCL中的表达式类似于ANSI C的表达式。表达式由操作数和操作符构成,下面分别介绍。 4.1 操作数 TCL表达式的操作数通常是整数或实数。整数一般是十进制的, 但如果整数的第一个字符是 0(zero),那么TCL将把这个整数看作八进制的,如果前两个字符是0x则这个整数被看作是十六进制 的。TCL的实数的写法与ANSI C中完全一样。如: 2.1 7.9e+12 6e4 3. 4.2 运算符和优先级 2011-09-01 版权所有,侵权必究 第8页,共66页
分享到:
收藏