ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:29.43KB ,
资源ID:4577065      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4577065.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(TCL教程.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

TCL教程.docx

1、TCL教程XX首页 | XX空间 | 登录 () ()查看文章TCL语言的一些学习资料TCL语言 Tcl tick 的构成 Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。是tool command language的缩写,发音为 tickle”, 实际上包含了两个部分:一个语言和一个库。 首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一 些互交程序如文本编辑器、调试器和shell。它有一个简单的语法 和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。 其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程

2、和可以使你扩充(定义新的 过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。 但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。 在下面的清单中,将会发现第一个很常见的示例程序,它是用 Tcl 实现的。这是一个完整的脚本:第一行命令调用 tclsh 环境,第二行命令执行实际工作。用您所选择的文本编辑器创建该脚本,输入 chmod +x hello.tcl 使之成为可执行文件,然后执行它以测试您这件“作品”。 /tcltk$ cat hello.tcl #!/usr/bin/tclsh puts stdout

3、 Hello, World! /tcltk$ ./hello.tcl Hello, World! Tcl 和 Tk 是解释型的、可扩展脚本语言。与 BSD 许可证十分相似,该许可证允许在任何情况下自由使用该软件,只要在所有副本中保留该版权并且在任何分发中一字不差地传递通告。这个许可证条款使 Tcl/Tk 成为自由软件。 Tcl/Tk 是一种解释型环境。可以通过添加预编译的 C 函数来扩展 Tcl 解释器,可从 Tcl 环境内部调用 Tcl 解释器。可以为特定目的或一般的以及广泛使用的而定制这些扩展。我们将在教程的后面看一些扩展并着重看一下第一个扩展 非常流行的 Expect。 在接下来的几屏中

4、,将回顾 Tcl 语言的一些主要特性,从元字符和全局变量到运算符、数学函数以及核心命令。毕竟,这些命令使 Tcl/Tk 成为有特色的,逐步发展的语言。请记住,在本教程中没有篇幅涉及每条命令。这里只突出一部分,以后您可以更进一步了解 Tcl/Tk。 #!/usr/bin/tclsh # filename hello2.tcl # This program code shows # metacharacter usage puts stdout Hello, World! a puts stdout Hello, World! a set Pints 6 set Days 7 puts stdou

5、t The answer to the universe is eval $Pints * $Days!n * /tcltk$ ./hello2.tcl Hello, World! Hello, World! a The answer to everything is 42!Tcl 元字符 元字符是在 Tcl/Tk 环境的上下文中有特殊含意的字符或字符对,它们包括分组语句、封装字符串、终止语句以及其它,如下表所示。左边列出的代码中演示了一些元字符。要注意的一个特殊特性是,当使用花括号(防止替代和扩展)代替双引号时,输出中的差异。 #!/usr/bin/tclsh # filename hell

6、o2.tcl # This program code shows # metacharacter usage puts stdout Hello, World! a puts stdout Hello, World! a set Pints 6 set Days 7 puts stdout The answer to the universe is eval $Pints * $Days!n * /tcltk$ ./hello2.tcl Hello, World! Hello, World! a The answer to everything is 42! 字符 用作 # 注释 ; 或 ne

7、wline 语句分隔符 Name 变量(区分大小写) Name(idx) 数组变量 Name(j,k,l.) 多维数组 string 带替换的引用 string 不带替换的引用 string 命令替换 char 反斜杠替代 行继续(在行尾)TCL语言(二) Tcl 全局变量和反斜杠替代 #!/usr/bin/tclsh # # Demonstrate global variables # and backslash substitution if $argc = 1 set N 1 foreach Arg $argv puts stdout $N: $Argn set N expr $N +

8、1 if $Arg = ring puts stdout a else puts stdout $argv0 on X Display $env(DISPLAY)n * /tcltk$ ./hello3.tcl ./hello3.tcl on X Display :0.0 /tcltk$ ./hello3.tcl ring 1: ring Tcl 全局变量和反斜杠替代 当 Tcl/Tk 脚本开始运行时,存在几个全局变量(如果在当前环境中为非空,则是预先定义的)。这些变量允许如下对操作系统进行访问:argc 是对脚本自变量的计数,而不是对调用的名称进行计数。 argv 是自变量的列表(不是数组)

9、。argv0 是调用的文件名(可以是符号链接)。env 是根据当前外壳的环境变量名建立下标的数组。errorCode 存储有关最近的 Tcl 错误信息,errorInfo 包含对这同一个错误事件的堆栈跟踪。该列表还有另外 12 个 tcl_xxx 变量,从 tcl_interactive 到 tcl_version。可以在 Tcl/Tk in a Nutshell 中找到好的总结,(有关更多信息,请参阅本教程末尾的“参考资料”)。 在左边的样本代码中,使用了其中几个变量以及(又一次)使用了一些反斜杠引用的字符(n 和 a)。 char 允许替代非打印 ASCII 字符。这对于 UNIX 下的许

10、多脚本语言和外壳环境都是常见的。如表中说明的那样,对于没有定义替代的反斜杠引用的字符只被简单地回送到输出。 字符 替代 a 响铃 b 退格 f 换页 n 或 newline 新行 r 回车 t 水平制表 v 垂直制表 space ( ) 空格 ddd 八进制值 xddd. 十六进制值 c 回显c 反斜TCL语言(三) Tcl 运算符和数学函数 /tcltk$ cat maths.tcl #!/usr/bin/tclsh # # Demonstrate operators and # math functions set PI expr 2 * asin(1.0) if $argc = 3 se

11、t X lindex $argv 0 set Y lindex $argv 1 set Rad lindex $argv 2 set Dist expr sqrt($X*$X)+($Y*$Y) set Cir expr 2*$PI*$Rad set Area expr $PI*$Rad*$Rad puts stdout Distance = $Dist puts stdout Circumference = $Cir puts stdout Area = $Area else puts stdout Wrong argument count! puts stdout Needs X, Y, a

12、nd Radius * /tcltk$ ./maths.tcl 3 4 5 Distance = 5.0 Circumference = 31.4159265359 Area = 78.5398163397 Tcl 支持一组标准的运算符和数学函数。这些运算符包括算术、位和逻辑运算符,可以通过 expr 命令使用常规的运算符优先次序规则进行求值。另外,考虑到 Tcl 的实质是面向字符串的脚本语言,所以对一些数学函数进行了合理的补充: 三角函数包括 cos(x)、acos(x)、cosh(x)、sin(x)、asin(x)、sinh(x)、tan(x)、atan(x)、atan2(y, x)、ta

13、nh(x) 和 hypot(x, y)。与这些函数相关的单位是弧度。 Log 函数是 exp(x)、log(x) 和 log10(x)。 算术函数是 ceil(x)、floor(x)、fmod(x, y)、pow(x, y)、abs(x)、int(x)、double(x) 和 round(x)。 rand() 和 srand(x) 是处理随机数的函数。 左边这个示例使用了其中一些运算符和函数来计算指定点到原点之间的距离,并返回给定半径的圆的周长和面积。另外,在这个示例中,使用列表下标(lindex)命令来访问 $argv 的个别元素。 TCL语言(四) Tcl 中的循环和分支 . # # pa

14、rse command line switches set Optimize 0 set Verbose 0 foreach Arg $argv switch -glob - $Arg -o* set Optimize 1 -v* set Verbose 1 default error Unknown $Arg set LineCount 0 while gets stdin Line = 0 # to confuse Vanna White. Remove_Vowels $Line $Optimize $Verbose incr LineCount return LineCount . Tc

15、l 中的循环命令是 while、for 和 foreach。条件(转移)命令是 if/then/else/elsif 和 switch。上述命令的限定语句是 break、continue、return 和 error。最后,catch 命令提供了错误处理能力。 if/then/else/elsif 已在前面几屏中演示过。在正式语法中会用到 then,但通常会省略掉它。 在左边这个示例中,foreach 结构给 switch 命令提供命令行自变量。当处理自变量时(注意:不正确的输入会终止脚本,因为还没有实现处理错误的 catch),while 循环通过为每一行调用过程并同时对行计数器加 1 来处

16、理输入。代码段结束时,返回处理的行数。 TCL语言(五) Tcl 字符串和模式匹配 /tcltk$ tclsh % set Phrase hello, world! hello, world! % string toupper $Phrase HELLO, WORLD! % string totitle $Phrase Hello, world! % string match ello $Phrase 0 % string match *ello* $Phrase 1 % string length $Phrase 14 % append Phrase Nice day, eh? hello,

17、 world! Nice day, eh? % string toupper $Phrase HELLO, WORLD! NICE DAY, EH? % string wordend $Phrase 7 12 字符串是 Tcl 中的基本数据类型。string 命令实际上是一组命令,这些命令都是属于 string 的。在使用中,正如在左边的示例中所看到,string 读取的方式非常象来自 OOP 编程特定对象方法的应用程序。 表示信息的 string 命令是 length 和 bytelength(可以有所不同,这取决于字符集)。返回布尔值(1 或 0)的比较是 compare、equal 和

18、match。这里的模式匹配是由“文件名替换”(简单类型的匹配通常与外壳操作相关)完成。还可以通过独特的 regex 和 regsub 命令来使用“高级正规表达式”。 在 Tcl 中执行 index、last、first、wordend 和 wordstart 命令可以实现下标功能。字符串修改是由 tolower、toupper、totitle、trim、trimleft、trimright、replace 和 map 来处理的。后者需要预先定义一个字符映射表。用 range 抽取子字符串,用 repeat 多次输出字符串。 可以使用 append 命令,将文本添加到现有变量中。通过使用与 C

19、语言的 printf 命令相同的样式和约定,format 命令可用来生成输出字符串。scan 对字符串进行解析并将值赋值给变量。最后,从 Tcl 8.0 开始,用 binary format 和 binary scan 命令添加了将二进制数据作为字符串处理的功能(因而能够处理空字符,而不会失败)。 TCL语言(六) Tcl 列表 /tcltk$ tclsh % set c1 Bob Carol Bob Carol % set c2 list Ted Alice Ted Alice % set Party1 list $c1 $c2 Bob Carol Ted Alice % set Party

20、2 concat $c1 $c2 Bob Carol Ted Alice % linsert $Party1 1 Richard Bob Carol Richard Ted Alice % 列表在 Tcl 中有两个主要用途。我们已经在通过 foreach 命令(在 Tcl 中的循环和分支中找到)处理命令行自变量的环境中看到第一个用途。第二个用途是动态地构建 Tcl 命令的元素,可以在本教程后面看到使用 eval 命令来执行这种用途。 list 命令接受它的所有自变量并将它们返回在一个列表环境中。自变量可以是值或变量。在左边这个示例中,可以手工创建列表,或可将其它列表视作自变量来使用列表(从而保

21、存第一个“Party”的两对方向)。或者,concat 命令用于将两个或多个列表合并到顶级项的单个实体,返回第二个更有趣的“Party”。 其它一些有用的列表命令及其语法是: llength $List 返回顶级项的计数结果。 lindex $List n 返回已建立下标的项,从 0 开始计数。 lrange $List i j 返回列表元素的范围。 lappend $List item. 将项附加到列表。 linsert $List n item. 在列表中的指定位置上插入一项或多项,向下移列表中的其它项。 其余列表命令还包括 lreplace、lsearch 和 lsort。split 命

22、令将字符串作为输入并生成经过正确解析的列表,并且在指定的字符处断开字符串。join 执行相反操作,接受列表元素并将它们串在一起,用 joinstring 分隔它们。 TCL语言(六) Tcl 数组 /tcltk$ tclsh % set People(friend) Tom Tom % set People(spouse) Marcia Marcia % set People(boss) Jack Jack % array names People friend boss spouse % set Person $People(friend) Tom % array get People fr

23、iend Tom boss Jack spouse Marcia % set People(friend) concat $People(friend) Bob Tom Bob % set Person $People(friend) Tom Bob % 理解 Tcl 数组的捷径是,将它们视作与 Perl 散列相同的东西。Tcl 数组不是用数字建立下标的线性数据结构,除非选择对数据强加那种解释。尽管带空格的字符串需要用引号括起或需要一个变量引用,但下标(或键)可以是任何字符串。 正如一般的变量一样,使用 set 命令初始化数组,如左边所示。圆括号内是给出的下标部分。请注意,圆括号不象花括号或双

24、引号那样提供分组。一旦初始化为数组,就不能将变量作为单一变量来访问。如左边列表底部所示,数组元素也可以是列表。 更多 Tcl 数组array 命令是一种多用途工具,很象 string。array exists 命令用于测试变量是否作为数组存在,array get 用于将数组转换成列表格式,array set 用于将列表转换为数组,array names 用于返回下标列表,array size 用于返回对下标进行计数的结果。搜索整个数组有它自己的一组四个命令:array startseach、array anymore、array nextelement 和 array donesearch。

25、虽然设计之初 Tcl 数组是一维的,但有一个模拟多维结构的好方法。因为下标是任意字符串,所以二维数组可以声明如下: set i 1 ; set j 10 set array($i,$j) 3.14159 incr $j set array($i,$j) 2.71828 这些数组键实际上分别只是字符串“1,10”和“1,11”,但对访问数据来说,谁知道这之间的差异? TCL语言(七) Tcl 过程 #!/usr/bin/tclsh # # Demonstrate procedures and # global scoping briefly set PI expr 2 * asin(1.0) p

26、roc circum global PI return expr 2.0 * $rad * $PI proc c_area global PI return expr $rad * $rad * $PI set rad 3 puts stdout Area of circle ofradius $rad is c_area $rad,nthe circumference iscircum $rad.n * /tcltk$ ./protest.tcl Area of circle of radius 3 is 28.2743338823, the circumference is 18.8495

27、559215. proc 命令定义 Tcl 过程。一旦定义后,就可以象内置的 Tcl 命令那样调用或使用它。另外,可以用缺省值定义这些参数;例如,将左边的定义更改为读取 proc c_area rad 1 。这将调用没有参数的 c_area 过程,并返回单位圆的面积。 所使用的 rename 命令正如它的字面含意一样,为现有命令或过程提供新名称。使用 rename 有两个明显的原因。第一个原因是,通过重命名原有过程,然后用相同名称的过程替换它,来给现有命令添加功能。过程可以调用原过程,必要时可以添加一些需要的功能。使用 rename 的第二个原因是,映射一个不存在的命令,例如,象 rename

28、 exec ; 一样,可以防止用户执行外部命令。 变量作用域规则 作用域规则描述了过程和变量名以及值在程序的不同层次上的可见性。例如,在脚本的最外层定义的变量是全局变量。缺省情况下,全局变量是不可见的,在过程内部也不可用它们的值。这允许过程的编写者自由地定义变量名并赋值,而不必担心覆盖对于局部作用域上未知的重要变量。要使全局变量在过程内部变得可见,必须将它声明为在过程内,就象在上一屏的示例中,对 PI 使用 global 命令那样。 upvar 命令提供将局部变量与另一个作用域中变量的值相关联的设施。这允许根据名称将变量调用进过程,这对于当过程需要可以修改在另一个作用域的值而不仅仅使用它时,就

29、显得非常方便。这个命令语法是 upvar level $VarName LocalVar ,其中 level 是到当前作用域之外的步骤数。“#0”表示全局作用域这一层。TCL语言(八) Tcl 中的数据结构 #!/usr/bin/tclsh # # Demonstrate Data Structures # using procedural wrappers proc UserAdd Acct rName eMail phone global uData if info exists uData($Acct,rname) return 1 set uData($Acct,rname) $rNa

30、me set uData($Acct,email) $eMail set uData($Acct,phone) $phone return 0 puts stdout UserAdd bpb Brian bilbrey 555-1212 puts stdout UserAdd tom Tom tom 555-1212 puts stdout UserAdd bpb Brian bilbrey 555-1212 * /tcltk$ ./datas.tcl 0 0 1 除简单的多维数组以外,通常建议用已专门用于过程接口的数组来实现 Tcl 数据结构。从结构的使用者角度来看,虽然这种设计隐藏了具体实现细节,但

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1