华为TCL培训教程全.docx
- 文档编号:7664396
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:64
- 大小:69.80KB
华为TCL培训教程全.docx
《华为TCL培训教程全.docx》由会员分享,可在线阅读,更多相关《华为TCL培训教程全.docx(64页珍藏版)》请在冰豆网上搜索。
华为TCL培训教程全
TCL培训教程(全)
(内部使用)
深圳市华为技术有限公司
TCL培训教程(全)
关键词:
TCL
摘要:
本文是TCL教材的第三稿,前两稿分别是《TCL的使用》和《TCL培训教程》。
这一稿加入了不少内容,是北研TCL兴趣小组共同努力的结果。
本文详细介绍了TCL的各个方面,特别对利用C\C++语言扩展TCL命令作了详细论述。
本文附有大量实例。
缩略语清单:
TCLToolCommandLanguage一种脚本语言
参考资料清单:
请在表格中罗列本文档所引用的有关参考文献名称、作者、标题、编号、发布日期和出版单位等基本信息。
参考资料清单
名称
作者
编号
发布日期
查阅地点或渠道
出版单位(若不为本公司发布的文献,请填写此列)
TclandTkToolKit
JohnK.Ousterhout
981-235-951-6
1999
自己的图书
AddisonWesleyPublishingCommpany
TCL的使用
陈旭盛
自写文档
TCL培训教程
陈旭盛
自写文档
1引言
TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage)。
它提供了通用的编程能力:
支持变量、过程和控制结构;同时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脚本可以包含一个或多个命令。
命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的:
seta1
setb2
或
seta1;setb2
TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。
TCL解释器对一个命令的求值过程分为两部分:
分析和执行。
在分析阶段,TCL解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换(substitution);在执行阶段,TCL解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。
2.2置换(substitution)
注:
在下面的所有章节的例子中,'%'为TCL的命令提示符,输入命令回车后,TCL会在接着的一行输出命令执行结果。
'//'后面是我自己加上的说明,不是例子的一部分。
TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如:
%setx10//定义变量x,并把x的值赋为10
10
%setyx+100//y的值是x+100,而不是我们期望的110
x+100
上例的第二个命令中,x被看作字符串x+100的一部分,如果我们想使用x的值'10',就必须告诉TCL解释器:
我们在这里期望的是变量x的值,而非字符'x'。
怎么告诉TCL解释器呢,这就要用到TCL语言中提供的置换功能。
TCL提供三种形式的置换:
变量置换、命令置换和反斜杠置换。
每种置换都会导致一个或多个单词本身被其他的值所代替。
置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。
2.2.1变量置换(variablesubtitution)
变量置换由一个$符号标记,变量置换会导致变量的值插入一个单词中。
例如:
%sety$x+100//y的值是10+100,这里x被置换成它的值10
10+100
这时,y的值还不是我们想要的值110,而是10+100,因为TCL解释器把10+100看成是一个字符串而不是表达式,y要想得到值110,还必须用命令置换,使得TCL会把10+100看成一个表达式并求值。
2.2.2命令置换(commandsubstitution)
命令置换是由[]括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所代替。
例如:
%sety[expr$x+100]
110
y的值是110,这里当TCL解释器遇到字符'['时,它就会把随后的expr作为一个命令名,从而激活与expr对应的C/C++过程,并把'expr'和变量置换后得到的'10+110'传递给该命令过程进行处理。
如果在上例中我们去掉[],那么TCL会报错。
因为在正常情况下,TCL解释器只把命令行中的第一个单词作为看作命令,其他的单词都作为普通字符串处理,看作是命令的参数。
注意,[]中必须是一个合法的TCL脚本,长度不限。
[]中脚本的值为最后一个命令的返回值,例如:
%sety[expr$x+100;setb300]//y的值为300,因为setb300的返回值为300
300
有了命令置换,实际上就表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参数。
2.2.3反斜杠置换(backslashsubstitution)
TCL语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、[、$等被TCL解释器当作特殊符号对待的字符。
例如:
setmsgmultiple\space//msg的值为multiplespace。
如果没有'\'的话,TCL会报错,因为解释器会把这里最后两个单词之间的空格认为是分隔符,于是发现set命令有多于两个参数,从而报错。
加入了'\'后,空格不被当作分隔符,'multiplespace'被认为是一个单词(word)。
又例如:
%setmsgmoney\\$3333\\nArray\a\[2]
//这个命令的执行结果为:
money$3333
Arraya[2]
这里的$不再被当作变量置换符。
TCL支持以下的反斜杠置换:
BackslashSequenceReplacedBy
\aAudiblealert(0x7)
\bBackspace(0x8)
\fFormfeed(0xc)
\nNewline(0xa)
\rCarriagereturn(0xd)
\tTab(0x9)
\vVerticaltab(0xb)
\dddOctalvaluegivenbyddd
(one,two,orthreed's)
\xhhHexvaluegivenbyhh
(anynumberofh's)
\newlinespaceAsinglespacecharacter.
例如:
%seta\x48//对应\xhh
H//十六进制的48正好是72,对应H
%seta\110//对应\ddd
H//八进制的110正好是72,对应H
%seta[expr\//对应\newlinespace,一个命令可以用\newline转到下一行继续
2+3]
5
2.2.4双引号和花括号
除了使用反斜杠外,TCL提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用双引号和花括号({})。
TCL解释器对双引号中的各种分隔符将不作处理,但是对换行符及$和[]两种置换符会照常处理。
例如:
%setx100
100
%sety"$xddd"
100ddd
而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作特殊处理。
%sety{/n$x[expr10+100]}
/n$x[expr10+100]
2.3注释
TCL中的注释符是'#','#'和直到所在行结尾的所有字符都被TCL看作注释,TCL解释器对注释将不作任何处理。
不过,要注意的是,'#'必须出现在TCL解释器期望命令的第一个字符出现的地方,才被当作注释。
例如:
%#Thisisacomment
%seta100#Notacomment
wrong#args:
shouldbe"setvarName?
newValue?
"
%setb101;#thisisacomment
101
第二行中'#'就不被当作注释符,因为它出现在命令的中间,TCL解释器把它和后面的字符当作命令的参数处理,从而导致错误。
而第四行的'#'就被作为注释,因为前一个命令已经用一个分号结束,TCL解释器期望下一个命令接着出现。
现在在这个位置出现'#',随后的字符就被当作注释了。
3变量
TCL支持两种类型的变量:
简单变量和数组。
3.1简单变量
一个TCL的简单变量包含两个部分:
名字和值。
名字和值都可以是任意字符串。
例如一个名为“13237&*:
hdgg"的变量在TCL中都是合法的。
不过为了更好的使用置换(substitution),变量名最好按C\C++语言中标识符的命名规则命名。
TCL解释器在分析一个变量置换时,只把从$符号往后直到第一个不是字母、数字或下划线的字符之间的单词符号作为要被置换的变量的名字。
例如:
%seta2
2
seta.14
4
%setb$a.1
2.1
在最后一个命令行,我们希望把变量a.1的值付给b,但是TCL解释器在分析时只把$符号之后直到第一个不是字母、数字或下划线的字符(这里是'.')之间的单词符号(这里是'a')当作要被置换的变量的名字,所以TCL解释器把a置换成2,然后把字符串“2.1”付给变量b。
这显然与我们的初衷不同。
当然,如果变量名中有不是字母、数字或下划线的字符,又要用置换,可以用花括号把变量名括起来。
例如:
%setb${a.1}
4
TCL中的set命令能生成一个变量、也能读取或改变一个变量的值。
例如:
%seta{kdfjkjdf}
kdfjkjdf
如果变量a还没有定义,这个命令将生成变量a,并将其值置为kdfjkjdf,若a已定义,就简单的把a的值置为kdfjkjdf。
%seta
kdfjkjdf
这个只有一个参数的set命令读取a的当前值kdfjkjdf。
3.2数组
数组是一些元素的集合。
TCL的数组和普通计算机语言中的数组有很大的区别。
在TCL中,不能单独声明一个数组,数组只能和数组元素一起声明。
数组中,数组元素的名字包含两部分:
数组名和数组中元素的名字,TCL中数组元素的名字(下标〕可以为任何字符串。
例如:
setday(monday)1
setday(tuesday)2
第一个命令生成一个名为day的数组,同时在数组中生成一个名为monday的数组元素,并把值置为1,第二个命令生成一个名为tuesday的数组元素,并把值置为2。
简单变量的置换已经在前一节讨论过,这里讲一下数组元素的置换。
除了有括号之外,数组元素的置换和简单变量类似。
例:
setamonday
setday(monday)1
setb$day(monday)//b的值为1,即day(monday)的值。
setc$day($a)//c的值为1,即day(monday)的值。
TCL不能支持复杂的数据类型,这是一个很大的缺憾,也是TCL受指责很多的方面。
但是TCL的一个扩展ITCL填补了这个缺憾。
3.3相关命令
3.3.1set
这个命令在3.1已有详细介绍。
3.3.2unset
这个命令从解释器中删除变量,它后面可以有任意多个参数,每个参数是一个变量名,可以是简单变量,也可以是数组或数组元素。
例如:
%unsetabday(monday)
上面的语句中删除了变量a、b和数组元素day(monday),但是数组day并没有删除,其他元素还存在,要删除整个数组,只需给出数组的名字。
例如:
%puts$day(monday)
can'tread"day(monday)":
nosuchelementinarray
%puts$day(tuesday)
2
%unsetday
%puts$day(tuesday)
can'tread"day(tuesday)":
nosuchvariable
3.3.3append和incr
这两个命令提供了改变变量的值的简单手段。
append命令把文本加到一个变量的后面,例如:
%settxthello
hello
%appendtxt"!
Howareyou"
hello!
Howareyou
incr命令把一个变量值加上一个整数。
incr要求变量原来的值和新加的值都必须是整数。
%setba
a
%incrb
expectedintegerbutgot"a"
%setb2
2
%incrb3
5
4表达式
TCL中的表达式类似于ANSIC的表达式。
表达式由操作数和操作符构成,下面分别介绍。
4.1操作数
TCL表达式的操作数通常是整数或实数。
整数一般是十进制的,但如果整数的第一个字符是0(zero),那么TCL将把这个整数看作八进制的,如果前两个字符是0x则这个整数被看作是十六进制的。
TCL的实数的写法与ANSIC中完全一样。
如:
2.1
7.9e+12
6e4
3.
4.2运算符和优先级
下面的表格中列出了TCL中用到的运算符,它们的语法形式和用法跟ANSIC中很相似。
这里就不一一介绍。
下表中的运算符是按优先级从高到低往下排列的。
同一格中的运算符优先级相同。
语法形式
结果
操作数类型
-a
!
a
~a
负a
非a
int,float
int,float
int
a*b
a/b
a%b
乘
除
取模
int,float
int,float
int
a+b
a-b
加
减
int,float
int,float
a<
a>>b
左移位
右移位
int
int
a
a>b
a<=b
a>=b
小于
大于
小于等于
大于等于
int,float,string
int,float,string
int,float,string
int,float,string
a==b
a!
=b
等于
不等于
int,float,string
int,float,string
a&b
位操作与
int
a^b
位操作异或
int
a|b
位操作或
int
a&&b
逻辑与
int,float
a||b
逻辑或
int,float
a?
b:
c
选择运算
a:
int,float
1.1数学函数
TCL支持常用的数学函数,表达式中数学函数的写法类似于C\C++语言的写法,数学函数的参数可以是任意表达式,多个参数之间用逗号隔开。
例如:
%setx2
2
%expr2*sin($x<3)
1.68294196962
其中expr是TCL的一个命令,语法为:
exprarg?
arg...?
两个?
之间的参数表示可省,后面介绍命令时对于可省参数都使用这种表示形式。
expr可以有一个或多个参数,它把所有的参数组合到一起,作为一个表达式,然后求值:
%expr1+2*3
7
%expr1+2*3
7
需要注意的一点是,数学函数并不是命令,只在表达式中出现才有意义。
TCL中支持的数学函数如下
abs(x)Absolutevalueofx.
acos(x)Arccosineofx,intherange0top.
asin(x)Arcsineofx,intherange-p/2top/2.
atan(x)Arctangentofx,intherange-p/2top/2.
atan2(x,y)Arctangentofx/y,intherange-p/2top/2.
ceil(x)Smallestintegernotlessthanx.
cos(x)Cosineofx(xinradians).
cosh(x)Hyperboliccosineofx.
double(i)Realvalueequaltointegeri.
exp(x)eraisedtothepowerx.
floor(x)Largestintegernotgreaterthanx.
fmod(x,y)Floating-pointremainderofxdividedbyy.
hypot(x,y)Squarerootof(x2+y2).
int(x)Integervalueproducedbytruncatingx.
log(x)Naturallogarithmofx.
log10(x)Base10logarithmofx.
pow(x,y)xraisedtothepowery.
round(x)Integervalueproducedbyroundingx.
sin(x)Sineofx(xinradians).
sinh(x)Hyperbolicsineofx.
sqrt(x)Squarerootofx.
tan(x)Tangentofx(xinradians).
tanh(x)Hyperbolictangentofx.
TCL中有很多命令都以表达式作为参数。
最典型的是expr命令,另外if、while、for等循环控制命令的循环控制中也都使用表达式作为参数。
2List
list这个概念在TCL中是用来表示集合的。
TCL中list是由一堆元素组成的有序集合,list可以嵌套定义,list每个元素可以是任意字符串,也可以是list。
下面都是TCL中的合法的list:
{}//空list
{abcd}
{a{bc}d}//list可以嵌套
list是TCL中比较重要的一种数据结构,对于编写复杂的脚本有很大的帮助,TCL提供了很多基本命令对list进行操作,下面一一介绍:
2.1list命令
语法:
list?
valuevalue...?
这个命令生成一个list,list的元素就是所有的value。
例:
%list12{34}
12{34}
2.2concat命令:
语法:
concatlist?
list...?
这个命令把多个list合成一个list,每个list变成新list的一个元素。
2.3lindex命令
语法:
lindexlistindex
返回list的第index个(0-based)元素。
例:
%lindex{12{34}}2
34
2.4llength命令
语法:
llengthlist
返回list的元素个数。
例
%llength{12{34}}
3
2.5linsert命令
语法:
linsertlistindexvalue?
value...?
返回一个新串,新串是把所有的value参数值插入list的第index个(0-based)元素之前得到。
例:
%linsert{12{34}}178{910}
178{910}2{34}
2.6lreplace命令:
语法:
lreplacelistfirstlast?
valuevalue...?
返回一个新串,新串是把list的第firs(0-based)t到第last个(0-based)元素用所有的value参数替换得到的。
如果没有value参数,就表示删除第first到第last个元素。
例:
%lreplace{178{910}2{34}}33
1782{34}
%lreplace{1782{34}}44456
1782456
2.7lrange命令:
语法:
lrangelistfirstlast
返回list的第first(0-based)到第last(0-based)元素组成的串,如果last的值是end。
就是从第first个直到串的最后。
例:
%lrange{1782456}3end
2456
2.8lappend命令:
语法:
lappendvarnamevalue?
value...?
把每个value的值作为一个元素附加到变量varname后面,并返回变量的新值,如果varname不存在,就生成这个变量。
例:
%lappenda123
123
%seta
123
2.9lsearch命令:
语法:
lsearch?
-exact?
?
-glob?
?
-regexp?
listpattern
返回list中第一个匹配模式pattern的元素的索引,如果找不到匹配就返回-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 TCL 培训 教程