收藏 分享(赏)

华为TCL培训教程_全_.pdf

上传人:HR专家 文档编号:6296669 上传时间:2019-04-05 格式:PDF 页数:70 大小:409.25KB
下载 相关 举报
华为TCL培训教程_全_.pdf_第1页
第1页 / 共70页
华为TCL培训教程_全_.pdf_第2页
第2页 / 共70页
华为TCL培训教程_全_.pdf_第3页
第3页 / 共70页
华为TCL培训教程_全_.pdf_第4页
第4页 / 共70页
华为TCL培训教程_全_.pdf_第5页
第5页 / 共70页
点击查看更多>>
资源描述

1、 TCL培训教程 (全 ) (内部使用 ) 深圳市华为技术有限公司 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 2页,共 70页 目 录 1 引言 .6 2 语法 .7 2.1 脚本、命令和单词符号 .7 2.2 置换 (substitution) .7 2.2.1 变量置换 (variable subtitution) .8 2.2.2 命令置换 (command substitution).8 2.2.3 反斜杠置换 (backslash substitution).9 2.2.4 双引号和花括号 .10 2.3 注释 10 3 变量 .10 3.1

2、 简单变量 10 3.2 数组 11 3.3 相关命令 12 3.3.1 set 12 3.3.2 unset 12 3.3.3 append和 incr.12 4 表达式 .13 4.1 操作数 13 4.2 运算符和优先级 .13 1.1 数学函数 14 2 List.15 2.1 list命令 15 2.2 concat命令 :.16 2.3 lindex命令 16 2.4 llength命令 .16 2.5 linsert命令 16 2.6 lreplace命令 :.16 2.7 lrange 命令 : 16 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利

3、用 第 3页,共 70页 2.8 lappend命令 :.17 2.9 lsearch 命令 : .17 2.10 lsort命令 : 17 2.11 split命令 : 18 2.12 join命令 18 3 控制流 .18 3.1 if命令 18 3.2 循环命令: while 、 for、 foreach .19 3.2.1 while命令 19 3.2.2 for命令 19 3.2.3 foreach命令 .20 3.2.4 break和 continue命令 20 3.2.5 switch 命令 .21 3.3 eval命令 21 3.4 source命令 21 4 过程 (proc

4、edure).21 4.1 过程定义和返回值 .22 4.2 局部变量和全局变量 .22 4.3 缺省参数和可变个数参数 .23 4.4 引用: upvar .24 5 字符串操作 25 5.1 format命令 25 5.2 scan命令 .25 5.3 regexp命令 26 1.1 regsub命令 28 1.2 string命令 .28 1.2.1 string compare ?-nocase? ?-length int? string1 string2.28 1.2.2 string equal ?-nocase? ?-length int? string1 string2.28

5、1.2.3 string first string1 string2 ?startindex? 29 1.2.4 string index string charIndex.29 1.2.5 string last string1 string2 ?startindex? 29 1.2.6 string length string.29 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 4页,共 70页 1.2.7 string match ?-nocase? pattern string.29 1.2.8 string range string first

6、last 30 1.2.9 string repeat string count.30 1.2.10 string replace string first last ?newstring?.30 1.2.11 string tolower string ?first? ?last? 30 1.2.12 string toupper string ?first? ?last?.30 1.2.13 string trim string ?chars? .30 1.2.14 string trimleft string ?chars?.31 1.2.15 string trimright stri

7、ng ?chars?.31 2 文件访问 31 2.1 文件名 31 2.2 基本文件输入输出命令 .31 2.3 随机文件访问 .33 2.4 当前工作目录 .33 2.5 文件操作和获取文件信息 .34 3 错误和异常 38 3.1 错误 38 3.2 从 TCL脚本中产生错误 .40 3.3 使用 catch捕获错误 40 3.4 其他异常 41 1 深入TCL 43 1.1 查询数组中的元素 .43 1.2 info命令 45 1.2.1 变量信息 .45 1.1.1 过程信息 .46 1.1.2 命令信息 .47 1.1.3 TCL的版本和库 .48 1.1.4 命令的执行时间 .4

8、8 1.1.5 跟踪变量 .48 1.1.6 命令的重命名和删除 .51 1.1.7 unknown命令 52 1.1.8 自动加载 .53 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 5页,共 70页 2 历史记录 54 3 TCL和CC+ 56 3.1 生成自己的 TCLSH57 3.2 扩展自己的命令:方法 (一 )57 3.2.1 编写扩展命令对应的 C/C+过程 57 3.2.2 注册命令 .59 3.2.3 命令返回值和命令对应的过程的返回值 .60 3.3 扩展自己的命令:方法 (二 )62 3.3.1 Tcl_Obj结构 .62 3.3.

9、2 编写扩展命令对应的 C/C+过程 64 3.3.3 注册命令 .65 3.4 利用 clientData参数和 deleteProc参数 .65 3.5 在 C/C+应用程序中嵌入 TCL 68 4 总结 .70 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 6页,共 70页 TCL培训教程 (全 ) 关键词 : TCL 摘 要 :本文是 TCL教材的第三稿,前两稿分别是 TCL的使用和 TCL培训教程。这一稿加入了不少内容,是北研 TCL兴趣小组共同努力的结果。本文详细介绍了 TCL的各个方面,特别对利用 CC+语言扩展 TCL命令作了详细论述。本文

10、附有大量实例。 缩略语清单 : TCL Tool Command Language 一种脚本语言 参考资料清单: 请在表格中罗列本文档所引用的有关参考文献名称、作者、标题、编号、发布日期和出版单位等基本信息。 参考资料清单 名称 作者 编号 发布日期 查阅地点或渠道 出版单位 (若不为本公司发布的文献,请填写此列) Tcl and Tk ToolKit John K.Ousterhout 981 235951 6 1999 自己的图书 Addison Wesley Publishing Commpany TCL的使用 陈旭盛 自写文档 TCL培训教程 陈旭盛 自写文档 1 引言 TCL(Too

11、l Command Language)是一种解释执行的脚本语言 (Scripting Language)。 它提供了 通用的编程能力:支持变量、过程和控制结构;同时 TCL还拥有一个功能强大的固有的核心命令集。 由于 TCL的解释器是用一个 CC+语言的过程库实现的,因此在某种意义上我们又可以把 TCL看作一个 C库,这个库中有丰富的用于扩展 TCL命令的 CC+过程和函数,可以很容易就在 CC+应用程序中嵌入 TCL,而且每个应用程序都可以根据自己的需要对 TCL语言进行扩展。我们可以针对某一特定应用领域对 TCL语言的核心命令集进行扩展,加入适合于自己的应用领域的扩展命令,如果需要,甚至可

12、以加入新的控制结构, TCL解释器将把扩展命令和扩展控制结构与固有命令和固有控制结构同等看待。扩展后的 TCL语言将可以继承 TCL 核心部分的所有功能,包括核心命令、控制结构、数据类型、对过程的支持等。根据需要,我们甚至可以屏蔽掉 TCL的某些固有命令和固有控制结构。通过对TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 7页,共 70页 TCL的扩展、继承或屏蔽,用户用不着象平时定义一种计算机语言那样对词法、语法、语义、语用等各方面加以定义,就可以方便的为自己的应用领域提供一种功能完备的脚本语言。 TCL良好的可扩展性使得它能很好地适应产品测试的需要,测试

13、任务常常会由于设计和需求的改变而迅速改变,往往让测试人员疲于应付。利用 TCL的可扩展性,测试人员就可以迅速继承多种新技术,并针对产品新特点迅速推出扩展 TCL命令集,以用于产品的测试中,可以较容易跟上设计需求的变化。 另外,因为 TCL是一种比 CC+ 语言有着更高抽象层次的语言,使用 TCL可以在一种更高的层次上编写程序,它屏蔽掉了编写 CC+程序时必须涉及到的一些较为烦琐的细节,可以大大地提高开发测试例的速度。而且, 使用 TCL语言写的测试例脚本,即使作了修改,也用不着重新编译就可以调用TCL解释器直接执行。可以省却不少时间。 TCL 目前已成为自动测试中事实上的标准。 2 语法 简单

14、的讲, TCL语言的语法实际上是一些 TCL解释器怎样对 TCL命令进行分析的规则的集合 。 2.1 脚本、命令和单词符号 一个 TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的: set a 1 set b 2 或 set a 1; set b 2 TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或 TAB键隔开。 TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段, TCL 解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换 (substitution); 在执行

15、阶段, TCL 解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的 C/C+过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。 2.2 置换 (substitution) 注:在下面的所有章节的例子中, 为 TCL的命令提示符,输入命令回车后, TCL会在接着的一行输出命令执行结果。 /后面是我自己加上的说明,不是例子的一部分。 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 8页,共 70页 TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如: %set x 10 /定义变量 x,并把 x

16、的值赋为 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) 变量置换由一个符号标

17、记,变量置换会导致变量的值插入一个单词中。例如: %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

18、 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 有

19、了命令置换,实际上就表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参数。 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 9页,共 70页 2.2.3 反斜杠置换 (backslash substitution) TCL语言中的反斜杠置换类似于 C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、 、 $等被 TCL解释器当作特殊符号对待的字符。例如: set msg multiple space /msg的值为 multiple space。 如果没有 的话, TCL会报错,因为解释器会把这里最后两个单词之间的空格认为是分隔符,于

20、是发现 set命令有多于两个参数,从而报错。加入了 后,空格不被当作分隔符, multiple space被认为是一个单词 (word)。又例如: %set msg money $3333 nArray a2 /这个命令的执行结果为: money $3333 Array a2 这里的 $不再被当作变量置换符。 TCL支持以下的反斜杠置换: Backslash Sequence Replaced By a Audible alert (0x7) b Backspace (0x8) f Form feed (0xc) n Newline (0xa) r Carriage return (0xd)

21、t Tab (0x9) v Vertical tab (0xb) ddd Octal value given by ddd (one, two, or three ds) xhh Hex value given by hh (any number of hs) newline space A single space character. 例如: set a x48 /对应 xhh H /十六进制的 48正好是 72,对应 H set a 110 /对应 ddd H /八进制的 110正好是 72,对应 H set a expr / 对应 newline space,一个命令可以用 newli

22、ne转到下一行继续 2+3 5 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 10页,共 70页 2.2.4 双引号和花括号 除了使用反斜杠外, TCL提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用双引号和花括号 ()。 TCL解释器对双引号中的各种分隔符将不作处理,但是对换行符 及和 两种置换符会照常处理。例如: %set x 100 100 %set y “$x ddd“ 100 ddd 而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义, TCL解释器不会对其作特殊处理。 %set y /n$x

23、 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 第二行中 就不被当作注释符,因为它出现在命令的中间,

24、 TCL解释器把它和后面的字符当作命令的参数处理,从而导致错误。而第四行的 就被作为注释,因为前一个命令已经用一个分号结束,TCL解释器期望下一个命令接着出现。现在在这个位置出现 #,随后的字符就被当作注释了。 3 变量 TCL支持两种类型的变量:简单变量和数组 。 3.1 简单变量 一个 TCL的简单变量包含两个部分:名字和值。名字和值都可以是任意字符串。例如一个名为 “1323 7set b 4 4 3.4 source命令 source命令读一个文件并把这个文件的内容作为一个脚本进行求值。例如: source e:/tcl&c/hello.tcl 注意路径的描述应该和 UNIX相同,使用

25、 /而不是 。 4 过程 (procedure) TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 22页,共 70页 TCL支持过程的定义和调用,在 TCL中 ,过程可以看作是用 TCL脚本实现的命令,效果与TCL的固有命令相似。我们可以在任何时候使用 proc命令定义自己的过程, TCL中的过程类似于 C中的函数。 4.1 过程定义和返回值 TCL中过程是由 proc命令产生的: 例如: % proc add x y expr $x+$y proc命令的第一个参数是你要定义的过程的名字,第二个参数是过程的参数列表,参数之间用空格隔开,第三个参数是一个 TC

26、L脚本,代表过程体。 proc生成一个新的命令,可以象固有命令一样调用: % add 1 2 3 在定义过程时,你可以利用 return命令在任何地方返回你想要的值。 return命令迅速中断过程,并把它的参数作为过程的结果。例如: % proc abs x if $x = 0 return $x return expr -$x 过程的返回值是过程体中最后执行的那条命令。 4.2 局部变量和全局变量 对于在过程中定义的变量,因为它们只能被访问,并且当过程退出时会被自动删除,所以称为局部变量;在所有过程之外定义的变量我们称之为全局变量。 TCL中,局部变量和全局变量可以同名,两者的作用域的交集为

27、空:局部变量的作用域是它所在的过程的内部;全局变量的作用域则不包括所有部。这一点和 C语言有很大的不同 . 如果我们想在过程内部引用一个全局变量的值,可以使用 global命令。例如: % set a 4 4 % proc sample x global a incr a TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 23页,共 70页 return expr $a+$x % sample 3 8 %set a 5 全局变量 a在过程中被访问。在过程中对 a的改变会直接反映到全局上。如果去掉语句global a, TCL会出错,因为它不认识变量 a. 4.

28、3 缺省参数和可变个数参数 TCL还提供三种特殊的参数形式: 首先,你可以定义一个没有参数的过程,例如: proc add expr 2+3 其次,可以定义具有缺省参数值的过程,我们可以为过程的部分或全部参数提供缺省值,如果调用过程时未提供那些参数的值,那么过程会自动使用缺省值赋给相应的。和 CC+中具有缺省参数值的函数一样,有缺省值的参数只能位于参数列表的后部,即在第一个具有缺省值的参数后面的所有参数,都只能是具数。 例如: proc add val1 val2 2 val3 3 expr $val1+$val2+$val3 则: add 1 /值为 6 add 2 20 /值为 25 ad

29、d 4 5 6 /值为 15 另外, TCL的过程定义还支持可变个数的参数,如果过程的最后一个参数是 args, 那么就表示这个过程支持可变个数的参数调用。调用时 ,位于 args以前的参数象普通参数一样处理,但任何附加的参数都需要在过程体中作特殊处理,过程的局部变量 args将会被设置为一个列表,其元素就是所有附加的变量。如果没有附加的变量, args就设置成一个空串,下面是一个例子: TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 24页,共 70页 proc add val1 args set sum $val1 foreach i $args inc

30、r sum $i return $sum 则: add 2 /值为 2 add 2 3 4 5 6 /值为 20 4.4 引用: upvar 命令语法 :upvar ?level? otherVar myVar ?otherVar myVar .? upvar命令使得用户可以在过程中对全局变量或其他过程中的局部变量进行访问。 upvar命令的第一个参数 otherVar是我们希望以引用方式访问的参数的名字,第二个参数 myVar 是这个过程中的局部变量的名字,一旦使用了 upvar 命令把 otherVar 和 myVar 绑定 ,那么在过程中对局部变量 myVar 的读写就相当于对这个过程的

31、调用者中 otherVar 所代表的局部变量的读写。下面是一个例子: % proc temp arg upvar $arg b set b expr $b+2 % proc myexp var set a 4 temp a return expr $var+$a 则: % myexp 7 13 这个例子中, upvar 把 $arg(实际上是过程 myexp中的变量 a)和过程 temp中的变量 b绑定,对 b的读写就相当于对 a的读写。 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 25页,共 70页 upvar命令语法中的 level参数表示:调用 u

32、pvar命令的过程相对于我们希望引用的变量myVar在调用栈中相对位置。例如: upvar 2 other x 这个命令使得当前过程的调用者的调用者中的变量 other,可以在当前过程中利用 x访问。缺省情况下, level的值为 1,即当前过程 (上例中的 temp)的调用者 (上例中的 myexp)中的变量 (上例中 myexp的 a)可以在当前过程中利用局部变量 (上例中 temp的 b)访问。 如果要访问全局变量可以这样写: upvar 0 other x 那么,不管当前过程处于调用栈中的什么位置,都可以在当前过程中利用 x访问全局变量 other。 5 字符串操作 因为 TCL把所有

33、的输入都当作字符串看待,所以 TCL提供了较强的字符串操作功能,TCL中与字符串操作有关的命令有: string、 format、 regexp、 regsub、 scan等。 5.1 format命令 语法: format formatstring ?vlue value.? format命令类似于 ANSIC中的 sprintf函数和 MFC中 CString类提供的 Format成员函数。它按formatstring提供的格式,把各个 value的值组合到 formatstring中形成一个新字符串,并返回。例如: %set name john John %set age 20 20 %

34、set msg format “%s is %d years old“ $name $age john is 20 years old 5.2 scan命令 语法: scan string format varName ?varName .? TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 26页,共 70页 scan命令可以认为是 format命令的逆,其功能类似于 ANSI C中的 sscanf函数。它按 format提供的格式分析 string字符串,然后把结果存到变量 varName中 ,注意除了空格和 TAB键之外, string 和 format

35、中的字符和 %必须匹配。例如: % scan “some 26 34“ “some %d %d“ a b 2 % set a 26 % set b 34 % scan “12.34.56.78“ “%d.%d.%d.%d“ c d e f 4 % puts format “the value of c is %d,d is %d,e is %d ,f is %d“ $c $d $e $f the value of c is 12,d is 34,e is 56 ,f is 78 scan命令的返回值是匹配的变量个数。而且,我们发现,如果变量 varName不存在的话, TCL会自动声明该变量。

36、 5.3 regexp命令 语法: regexp ?switchs? ?-? exp string ?matchVar? ?subMatchVar subMatchVar.? regexp命令用于判断正规表达式 exp是否全部或部分匹配字符串 string,匹配返回 1,否则 0。 在正规表达式中,一些字符具有特殊的含义,下表一一列出,并给予了解释。 字符 意义 . 匹配任意单个字符 表示从头进行匹配 $ 表示从末尾进行匹配 x 匹配字符 x,这可以抑制字符 x的含义 chars 匹配字符集合 chars中给出的任意字符,如果 chars中的第一个字符是 ,表示匹配任意不在 chars中的字符

37、, chars的表示方法支持 a-z之类的表示。 (regexp) 把 regexp作为一个单项进行匹配 * 对 *前面的项 0进行次或多次匹配 + 对前面的项进行 1次或多次匹配 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 27页,共 70页 ? 对?前面的项进行 0次或 1次匹配 regexp1|regexp2 匹配 regexp1或 regexp2中的一项 下面的一个例子是从 Tcl and Tk ToolKit中摘下来的,下面进行说明: (0x)?0-9a-fA-F+|0-9+)$ 这个正规表达式匹配任何十六进制或十进制的整数。 两个正规表达式以

38、 |分开 (0x)? 0-9a-fA-F+和 0-9+,表示可以匹配其中的任何一个,事实上前者匹配十六进制,后者匹配的十进制。 表示必须从头进行匹配,从而上述正规表达式不匹配 jk12之类不是以 0x或数字开头的串。 表示必须从末尾开始匹配,从而上述正规表达式不匹配 12jk之类不是数字或 a-fA-F结尾的串。 下面以 (0x)? 0-9a-fA-F+ 进行说明, (0x)表示 0x一起作为一项, ?表示前一项 (0x)可以出现 0次或多次, 0-9a-fA-F表示可以是任意 0到 9之间的单个数字或 a到 f或 A到 F之间的单个字母,表示象前面那样的单个数字或字母可以重复出现一次或多次。

39、 % regexp (0x)?0-9a-fA-F+|0-9+)$ ab 1 % regexp (0x)?0-9a-fA-F+|0-9+)$ 0xabcd 1 % regexp (0x)?0-9a-fA-F+|0-9+)$ 12345 1 % regexp (0x)?0-9a-fA-F+|0-9+)$ 123j 0 如果 regexp命令后面有参数 matchVar和 subMatchVar,则所有的参数被当作变量名,如果变量不存在,就会被生成。 regexp把匹配整个正规表达式的子字符串赋给第一个变量,匹配正规表达式的最左边的子表达式的子字符串赋给第二个变量,依次类推,例如: % regexp

40、 (0-9+) *(a-z+) “ there is 100 apples“ total num word 1 % puts “ $total ,$num,$word“ 100 apples ,100,apples regexp可以设置一些开关( switchs,来控制匹配结果: -nocase 匹配时不考虑大小写 -indices 改变各个变量的值,这是各个变量的值变成了对应的匹配子串在整个字符串中所处位置的索引。例如: % regexp -indices (0-9+) *(a-z+) “ there is 100 apples“ total num word 1 TCL培训教程 (全 )

41、华为内部资料 7/27/2010 版权所有,好好利用 第 28页,共 70页 % puts “ $total ,$num,$word“ 9 20 ,10 12,15 20 正好子串 “ 100 apples”的序号是 9-20,“100“的序号是 10-12,“apples“的序号是 15-20 - 表示这后面再没有开关 ( switchs了,即使后面有以 -开头的参数也被当作正规表达式的一部分。 1.1 regsub命令 语法: regsub ?switchs? exp string subSpec varname regsub的第一个参数是一个整个表达式,第二个参数是一个输入字符串,这一点

42、和 regexp命令完全一样,也是当匹配时返回 1,否则返回 0。不过 regsub用第三个参数的值来替换字符串 string中和正规表达式匹配的部分,第四个参数被认为是一个变量,替换后的字符串存入这个变量中。例如: % regsub there “They live there lives “ their x 1 % puts $x They live their lives 这里 there被用 their替换了。 regsub命令也有几个开关 (switchs): -nocase 意义同 regexp命令中。 -all 没有这个开关时, regsub只替换第一个匹配,有了这个开关, re

43、gsub将把所有匹配的地方全部替换。 - 意义同 regexp命令中。 1.2 string命令 string命令的语法: string option arg ?arg.? string命令具有强大的操作字符串的功能,其中的 option选项多达 20个。下面介绍其中常用的部分。 1.2.1 string compare ?-nocase? ?-length int? string1 string2 把字符串 string1和 string2进行比较 ,返回值为 -1、 0或 1,分别对应 string1小于、等于或大于 string2。如果有 -length 参数,那么只比较前 int 个字

44、符,如果 int为负数,那么这个参数被忽略。 如果有 -nocase参数,那么比较时不区分大小写。 1.2.2 string equal ?-nocase? ?-length int? string1 string2 把字符串 string1和 string2进行比较,如果两者相同,返回值为 1,否则返回 0。其他参数与 8.5.1同。 TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 29页,共 70页 1.2.3 string first string1 string2 ?startindex? 在 string2 中从头查找与 string1匹配的字符序

45、列,如果找到,那么就返回匹配的第一个字母所在的位置 (0-based)。如果没有找到,那么返回 -1。如果给出了 startindex变量,那么将从 startindex处开始查找。例如: % string first ab defabc 3 % string first ab defabc 4 -1 1.2.4 string index string charIndex 返回 string 中第 charIndex个字符 (0-based)。 charIndex可以是下面的值: 整数 n: 字符串中第 n个字符 (0-based) end : 最后一个字符 end整数 n:倒数第 n个字符。

46、 string index “abcd“ end-1 返回字符 c 如果 charIndex小于 0,或者大于字符串 string的长度,那么返回空。 例如 : % string index abcdef 2 c % string index abcdef end-2 d 1.2.5 string last string1 string2 ?startindex? 参照 8.5.3.唯一的区别是从后往前查找 1.2.6 string length string 返回字符串 string的长度 . 1.2.7 string match ?-nocase? pattern string 如果 pa

47、ttern 匹配 string,那么返回 1,否则返回 0.如果有 -nocase参数 ,那么就不区分大小写 . 在 pattern 中可以使用通配符 : * 匹配 string中的任意长的任意字符串 ,包括空字符串 . ? 匹配 string中任意单个字符 chars 匹配字符集合 chars中给出的任意字符 ,其中可以使用 A-Z这种形式 x 匹配单个字符 x,使用 是为了让 x可以为字符 *,-,. 例子 : TCL培训教程 (全 ) 华为内部资料 7/27/2010 版权所有,好好利用 第 30页,共 70页 % string match * abcdef 1 % string mat

48、ch a* abcdef 1 string match a?cdef abcdef 1 % string match ab-fcdef abcdef /注意一定药用 ,否则 TCL解释器会把 b-f当作命令名 1 /从而导致错误 % string match ab-fcdef accdef 1 1.2.8 string range string first last 返回字符串 string中从第 first个到第 last个字符的子字符串 (0-based)。如果 first0,那么 first被看作0,如果 last大于或等于字符串的长度,那么 last被看作 end,如果 first比 last大,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报