TCL脚本语⾔详解
语⾔简介
TCL是⼀种很通⽤的脚本语⾔,功能强⼤。最早称为“⼯具命令语⾔”"Tool Command Language",但是⽬前已经不是这个含义,不过我们仍然称呼它TCL,发⾳为"tickle”。TCL经常被⽤于快速原型开发,脚本编程,GUI和测试等⽅⾯。
实际上包含了两个部分:⼀个语⾔和⼀个库。⾸先,Tcl是⼀种简单的脚本语⾔,主要使⽤于发布命令给⼀些互交程序如⽂本编辑器、调试器和shell。它有⼀个简单的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能⼒。其次,Tcl是⼀个库包,可以被嵌⼊应⽤程序,Tcl的库包含了⼀个分析器、⽤于执⾏内建命令的例程和可以使你扩充(定义新的过程)的库函数。应⽤程序可以产⽣Tcl命令并执⾏,命令可以由⽤户产⽣,也可以从⽤户接⼝的⼀个输⼊中读取(按钮或菜单等)。但Tcl库收到命令后将它分解并执⾏内建的命令,经常会产⽣递归的调⽤。
Tcl数据类型简单。对Tcl来说,它要处理的数据只有⼀种——字符串。Tcl将变量值以字符串的形式进⾏存储,不关⼼它的实际使⽤类型。内嵌的Tk(toolkit)图形⼯具可以提供简单⽽⼜丰富的图形功能,让⽤户可以轻松的创建简单的图形界⾯。
Tcl的执⾏是交互式的,Tcl提供了交互式命令界⾯,界⾯有两种:tclsh和wish。tclsh只⽀持Tcl命令,wish⽀持Tcl和Tk命令。通过交互界⾯,我们就可以象执⾏UNIX shell命令⼀样,逐条命令执⾏,并即时得到执⾏结果。
Tcl/Tk可以提供跨平台的⽀持。Tcl语⾔可以运⾏于绝⼤多数当今流⾏的UNIX、WINDOWS和Macintosh等系统上,⽽且命令通⽤,只是启动的细节有些不同。
基本语法
1、命令结构:commandName arguments。每条命令之间通过换⾏或者;隔开。例如:
set foo 0
set bar 1;
2、注释:使⽤#注释,不过要注意的是下⾯的注释是错误的:
set foo0 #这个是注释(错误)
因为tcl解析器总是认为⼀条命令应该以换⾏或者分号结束,其他的在同⼀⾏中都认为是参数。所以正确的应该是:
set foo 0;  #这个是注释
其实对于习惯于编译型编程语⾔的⼈来说每⾏末尾加个;应该是理所当然的事情,所以这个对我们应该没有什么不习惯的。
3、数据类型:tcl不⽀持其他语⾔中的形如int, double ,char等等类型,唯⼀⽀持的就是string类型。也就是说⼀个变量可以在不同的时刻理解为不同的类型。
4、变量:tcl可以定义两种类型的变量,变量和数组。
变量:在tcl变量不需要声明就可以直接赋值。给变量赋值的例⼦:
set ba 1;
set ma “qian lifeng”; #加引号的作⽤是为了告诉编译器包括空格
取得变量的值可以在对应的变量名前⾯加$来取得,例如:
puts $ba;  #表⽰打印出ba的值
数组:数组也不需要声明,直接赋值,例如:
set qian(0) 1;
set qian(1) 2;
⼀个⽐较有意思的地⽅是数组下标可以不按照顺序来写,也不⼀定是数字,可以是字符串。例如:
set qian(123) f;
set qian(6789)fs;
set qian(good)yes;
我们可以使⽤puts $qian(123); 的形式来获得数组的内容。当然tcl数组也⽀持多维数组,声明形式为:
setqian(1,1,1,1,1) fs; #随便多少维
如果我们要查看某个已经赋值的数组的信息,可以使⽤parray命令:如:
parray qian;  #将打印出qian数组的所有信息
5、字符串操作:string 命令基本语法如下(这⾥的string1,string2可以是字符串也可以是变量,option是下列选项之⼀)。
stringoption string1 string2;
option的操作选项:
compare按照字典的排序⽅式进⾏⽐较。根据string1 <, =, >string2分别返回-1, 0, 1
shell最简单脚本first返回string2中第⼀次出现string1的位置,如果没有出现string1则返回-1
last和first相反
trim从string1中删除开头和结尾的出现在string2中的字符
tolower返回string1中的所有字符被转换为⼩写字符后的新字符串
toupper返回string1中的所有字符串转换为⼤写后的字符串
length返回string1的长度
例⼦:
string length$qian;  #将返回变量qian的长度
6、数字操作:因为tcl中只有⼀个string类型的变量,所以当要操作数字进⾏运算的时候,tcl提供了incr和expr两个操作数。
incr的基本⽤法为:
incrvariable integer(variable必须为数字)
例如我要将⼀个数字加3
set a 3;
incr a 3;  #将a加3,如果要减3,则为 incr a–3;
默认的incr a等同于a++的意思,即本⾝⾃增1。
expr的基本语法为:
expr functionnumber
expr是为了提供更加复杂的操作⽽设计的⼀个语法,⽐如运算乘除法等等。在执⾏算术操作的时候必须将expr命令放在算术操作之前。例如:
set a 20; set b4;
set c [expr$a/$b];  #此时的c的值为5
除此之外,expr还能够识别⼀些函数及其返回值如下:
abs(x) x的绝对值
round(x) x舍⼊后得到的整数值
sin(x) x的正弦
…………………………………..
举个例⼦:
set a [exprsin(0.3)]; #计算0.3的正弦
7、转义
在tcl中可以使⽤{}将需要转义的字符串括起来。例如:
set a 5;
set b {$a};  #此时b的值为”$a“,⽽不是5。
8、流控制
if控制流,基本语法:
if { 表达式 } {
#运算;
} else {
#其他运算;
}
需要注意的是if….else, if……elseif…中的else,elseif必须要和if的后⾯⼀个{在同⼀⾏。
switch控制流:基本语法:
switch $x {
          数值1 { 操作1 ;}
数值2 { 操作2 ;}
}
9、循环
tcl提供三种循环命令,分别为:for,foreach,while。此外tcl还提供两个循环控制命令。注意:这个三个命令中的程序块的开始花括号必须要和三个命令同⼀⾏。
1、while基本语法:while {条件} { 程序块 }
2、foreach将在⼀组变元中进⾏循环,并且每次都将执⾏他的循环体。基本结构:  foreachvariable {items} {block}
这⾥的variable是变量的名字,便于block中使⽤。举例:
foreach element{0 m n b v} {
switch$element {
# 判断element的值
}
}
3、for是最常⽤的循环。其基本结构为:for{initialization} {condition} {increment} {body}
例如:for {set i 0} {$i< 10} {incr i} {puts $i;}  #将打印出0到9
程序⽰例
# add a member function call "greet"
Class mom
mom instproc greet {} {
$selfinstvar age_
puts"$age_ year old mom say: How are you doing?"
}
# Create a child class of "mom" called"kid"
# and overide the member function "greet"
Class kid -superclass mom
kid instproc greet {} {
$selfinstvar age_
puts"$age_ year old kid say: What's up, dude?"
}
# Create a mom and a kid object, set each age
set a [new mom]
$a set age_ 45
set b [new kid]
$b set age_ 15
# Calling member function "greet" of eachobject
$a greet
$b greet

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。