Tcl语言参考
    Tcl("Tool Command Language",即工具命令语言;Tcl念作"tickle"即“踢叩”  )是一种简单易用易于扩展的嵌入式脚本语言, 主要用于发布命令给交互式程序(如文本编辑器、调试器),及完成自动化批处理工作。Tcl语言不同于其他语言的最大的特点是:Tcl程序由Tcl命令序列组成,其每条语句都是一条指令。
由于其极易扩展的特性,Tcl有大量的用C/C++编写的扩展用于提供Tcl本身不具有的功能。其中使用最广泛的扩展是TK,TK提供了各种OS平台下的图形用户界面GUI(连强大的Python语言都不单独提供自己的GUI,而是提供接口适配到TK上)。另一个流行的扩展包是Expect,它提供了通过终端自动执行命令的能力,例如passwd, ftp, telnet等命令驱动的外壳。
一、Tcl程序基本结构
1、基本语法
    Tcl的语法类似于shell:一条Tcl的命令串包含若干条命令,命令使用换行符或分号来隔开;而每一条命令包含若干个域(field),域使用空白(空格或TAB)来隔开——第一个域是命令的名字,其它的域是该命令的参数。
    Tcl解释器对一个命令的执行过程分为两步:分析阶段和执行阶段。在分析阶段,Tcl 解释器运用规则识别出命令并把命令分成一个个独立的单词,同时进行必要的置换(substitution); 在执行阶段,Tcl 解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有后面的单词作为参数传递给该命令过程,让命令过程进行处理。
    Tcl解释器既可以执行Tcl内建命令亦可执行用户自己通过C/C++函数实现的新建命令,在应用程序中可用函数Tcl_CreateCommand来完成命令的创建。所有命令参数都被作为字符串来传递,命令自己会按其所需来解释参数。
    另外关于Tcl的注释有一个特殊的要求:'#'必须出现在Tcl解释器期望命令的第一个字符出现的地方,才被当作注释。例如:
set a 100  # Not a comment
set b 101;  # this is a comment
    第一个例子中'#'及其后面的内容会被当作set 的参数而非注释从而导致参数个数错误;但第二个被解释为注释,因为'#'前面有一个分号,而分号和换行一样被看作是命令的分隔符。
2、置换(Substitution)
set x 10
set y 100 + x
    上面命令执行后,y的值是“100 + x”而不是我们期望的110。这是因为Tcl解释器在分析命令时,把所有的命令参数都当作字符串看待,所以x 被看作了字符串“100 + x”的一部分。如果我们想使用x的值'10' ,就必须告诉Tcl解释器:我们在这里期望的是变量x的值,而非字符'x'。那么怎么告诉Tcl解释器呢?这就要用到Tcl语言中的置换功能。
    Tcl提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单词本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。
(1)变量置换(variable substitution)
    变量置换由一个$符号标记,变量置换会导致变量的值而非变量(标识符)本身被插入到字符串中。
set x 10
set y 100 + $x
    这时,y的值还不是我们想要的值110,而是10+100,因为Tcl解释器把10+100看成是一个字符串而不是表达式;y要想得到值110,还必须用命令置换,使得Tcl会把10+100看成一个表达式并求值。
(2)命令置换(command substitution)
    命令置换是由[]括起来的Tcl命令及其参数,命令置换会导致某一个命令的所有或部分单词(参数)被另一个命令的结果所代替。
set x 10
set y [expr 100+$x]
    这时,y的值就是110了。这里当Tcl解释器遇到字符'['时,它就会把随后的expr作为一个命令名,从而激活与expr对应的C/C++过程,并把expr命令中变量置换后得到的'10+110'传递给该命令过程进行处理。
   
    有了命令置换,实际上就表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参数。
    注意,[]中必须是一个合法的Tcl脚本,长度不限。[]中脚本的值为最后一个命令的返回值。
   
(3)反斜杠置换(backslash subtitution)
    Tcl语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、[、$等被Tcl解释器当作特殊符号对待的字符。例如:
set msg multiple\ space 
    如果没有'\'的话,Tcl会报错,因为解释器会把这里最后两个单词之间的空格认为是分隔符,于是发现set命令有多于两个参数,从而报错。加入了'\'后,空格不被当作分隔符,'multiple space'被认为是一个单词(word)。
(4)双引号和花括号
    除了使用反斜杠外,Tcl提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用双引号和花括号({})。
    Tcl解释器对双引号中的各种分隔符将不作处理,但是对换行符及$和[]两种置换符会照常处理。而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,Tcl解释器不会对其作特殊处理。
二、Tcl变量数据类型
    Tcl只支持一种数据类型:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请牢记这一点,所有的东西都是字符串(然而字符串的实际解释是依赖于其所处上下文,共有三种解释:命令, 表达式和表)。
(1)简单变量
    一个Tcl的简单变量包含两个部分:名字和值,其中名字和值都可以是任意字符串。不过为了更好的使用变量置换功能,变量名最好按C\C++语言中标识符的命名规则命名。这是因为Tcl解释器在分析一个变量置换时,只把从$符号往后直到第一个不是字母、数字或下划线的字符之间的单词符号作为要被置换的变量的名字。例如:
set a 2
set a.1 5
set b $a.1
    在最后一个命令行,我们希望把变量a.1的值付给b,但是Tcl解释器在分析时只把$符号之后直到第一
个不是字母、数字或下划线的字符(这里是'.')之间的单词符号(这里是'a')当作要被置换的变量的名字,所以Tcl解释器把a置换成2,然后把字符串“2.1”付给变量b。这显然与我们的初衷不同。当然,如果变量名中有不是字母、数字或下划线的字符又要用变量置换,可以用花括号把变量名括起来。例如:
set b ${a.1}
(2)数组变量
    数组是一些元素的集合。Tcl的数组和一般编程语言中的数组有很大的区别。在Tcl中,不能单独声明一个数组,数组只能和数组元素一起声明。数组中数组元素的名字包含两部分:数组名和数组中元素的名字,Tcl中数组元素的名字(下标〕可以为任何字符串。例如:
set day(monday) 1 
set day(sunday)  2
(3)string结构及其操作
    因为TCL把所有的输入都当作字符串看待,所以TCL提供了较强的字符串操作功能
【format】
    语法:format formatstring
    format命令类似于ANSIC中的sprintf函数,它按formatstring提供的格式,把各个value的值组合到forma-tstring中形成一个新字符串并返回。例如:
set msg [format "%s is %d years old" $name $age] 
【scan】
    语法:scan string formatsting varName varName ...
    scan命令可以认为是format命令的逆,其功能类似于ANSI C中的sscanf函数。它按formatsting提供的格式分析string字符串,然后把结果存到变量varName中,注意除了空格和TAB键之外,string 和formatsting中的字符和'%'必须匹配。例如:
scan "some 26 34" "some %d %d" a b
【regexp】
    语法:regexp [switchs] [--] exp string [matchVar]\ []
    regexp命令用于判断正规表达式exp是否全部或部分匹配字符串string,匹配返回1,否则0。
    regexp可以设置一些开关(switchs〕,来控制匹配的具体方式,如:-nocase,-line等,其中-- 表示这后面再没有开关(switchs〕了,即使后面有以'-'开头的参数也被当作正规表达式的一部分。如果regexp命令后面有参数matchVar和subMatchVar,则所有的参数被当作变量名,如果变量不存在,就会被生成。 
    regexp把匹配整个正规表达式的子字符串赋给第一个变量,匹配正规表达式的最左边的子表达式的子字符串赋给第二个变量,依次类推,例如:
regexp { ([0-9]+) *([a-z]+)} " there is 100 apples" total num word 
puts " $total ,$num,$word" 
    显示结果为:100 apples ,100,apples
tickle
【regsub】
    语法:regsub [switchs] exp string subSpec varname

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