1.命令之间必须用换行或者分号隔开,单词之间必须用空格或 TAB 键隔开。
2.TCL 解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL 解释器运用规 则把命令分成一个个独立的单词,同时进行必要的置换(substitution); 在执行阶段,TCL 解 释器会把第一个单词当作命令名, 并查看这个命令是否有定义, 如果有定义就激活这个命令对应 的 C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。
3.赋值set,其有返回值,为所赋之值。
4.置换,分为变量置换,命令置换与反斜杠置换 .变量置换$, .命令置换[],它把随后的单词当作一个命令,eg:[expr 1+1]。[]里可以放多个命令,但是其返回值为最后一个命令的返回值。 .反斜杠置换,用于单词中插入特殊字符,比如空格,换行,[,$,以及C语言中的/n,/v等。
(bin) 28 % set a.1 2;puts $b
2
(bin) 29 % set b $a.1;puts $b
2
(bin) 30 % set b ${a.1};puts $b
2
TCL不能支持复杂的数据类型,不过扩展ITCL填补了这个缺憾。
unset命令可以删除变量。
5.双引号及大括号 在双引号中各种分隔符不起作用,但是对换行符,及$,[]两种置换会起作用。而在大括号中,所以特殊字符将失去其特殊含义。
6.注释 在TCL解释器期望出现命令的地方出现的#到行末的部分被当作注释,eg:%#comment 或者 %set a b;#comment
7.变量 .变量最好按C/C++变量名要求,因为在置换时只把$往后第一个不是数字,字母,下划线的部分替换。当然,如果加上{}就另当别论了。 .TCL只支持关联数组。
8.相关命令 .set 赋值 .unset 它后面可以跟任意多个变量名,如果跟数组名则删掉整个数组。 .append 追加变量到一个文本型变量之后。 .incr 将一个数值加到一个整形变量上。
9.字符串
append将文本加到一个变量的后面
incr命令把变量值加上一个整数。
TCL表达式操作数是整数或实数。0开头表示八进制,0X开头表示十六进制
支持加减乘除,移位等操作。
此外expr是TCP的一个命令,
list在TCL中表示集合,可以嵌套定义。
concat命令,把多个list合成一个list.
lindex返回list的第index个0-based元素
llength返回list的元素个数。
linsert返回一个新串,把所有的value参数值插入list的第index个元素之前
lreplace替换第first到第last个元素所有的value参数。
lrange返回list的第first到第last元素组成的串。如果last为end表示到串的最后。
lappend将value值作为一个元素附加到变量varname后面,并返回变量的新值
lsearch返回list中第一个匹配模式pattern的元素的索引,找不到匹配就返回-1.-exact,-glob,-regexp是三种匹配。-exact表示精确匹配,-glob和string match命令匹配方式相同。-regexp表示正规表达式匹配。
lsort这个命令返回把list排序后的串。
Split把string按分隔符splitChars分成一个个单词。例如split “how.are.you” .
Join是命令的逆。把所有元素合并到一个字符串中,中间以joinString分开。
10.字符串操作
format格式化类似sprintf函数
set msg [format "%s is %d yearsold" $name $age];
scan命令式format命令的逆,类似于sscanf函数。
regexp用于判断正规表达式exp是否全部或部分匹配字符串string,匹配返回1,否则0.
resub命令第一个参数是一个整个表达式,第二个参数是一个输入字符串,这一点和regexp命令完全一样。匹配返回1,否则返回0,不过regsub用第三个参数来替换字符串string中和正规表达式匹配的部分,第四个参数被认为是一个变量,替换后的字符串存入这个变量中。
String命令具有强大的操作字符串的功能,其中option选项多达20
12.控制流 .
If后面的{一定要写在上一行,如果不这样TCL解释器会认为if命令在换行符处已结束,下一行会被当成新的命令,从而导致错误的结果。此外if和{之间需要有个空格,否则TCL会把if{当成一个整体,从而导致错误。
whiletest body
Test是一个表达式,body是一个脚本,如果表达式的值非0,就运行脚本,直到表达式为0才停止循环。
forinit test reinit body
参数init是一个初始化脚本,第二个参数test是一个表达式,用来决定循环什么时候中断,第三个参数reinit是一个重新初始化的脚本,第四个参数body也是脚本,代表循环体。
Foreach命令有两种语法形式
第一种:foreachvarName list body
第二种:foreachvarlist1 list1 ?varlist2 list2 ..? Body
TCL支持switch命令,支持三种匹配方式:-exact,-glob,-regexp方式
缺省是-glob方式。-regexp是正规表达式的匹配方式。
13.过程
Proc命令的第一个参数是你要定义的过程的名字,第二个参数是过程的参数列表,参数之间用空格隔开。
proc add {x y} {expr $x+$y}
定义过程时,可以使用return命令在任何地方返回想要的值。
TCL提供三种特殊的参数形式:
upvar命令使得用户可以在过程中对全局变量或其他过程中的局部变量进行访问。
可以理解成绑定变量
14.文件 .
eval可以接收一个或多个参数,然后把所有的参数以空格隔开组合到一起成为一个脚本,然后对这个脚本进行求值。
source命令读一个文件并把这个文件的内容作为一个脚本进行求值。
Open命令以access方式打开文件. Open命令返回一个字符串用于表识打开的文件。TCL有三个特定的文件标识:stdin,stdout,stderr.对应标准输入、标准输出和错误通道。
Gets读fileid标识的文件下一行,忽略换行符。
Gets类似的命令是read,不过read不是一行为单位。
Puts把string写到fileid中。
Flush把缓冲区内容写到filed标识的文件中。
Close关闭标识为filedid的文件。
Tcl提供了seek,tell和eof等命令使用户可以非连续访问文件。
TCL提供pwd和cd命令来管理当前工作目录。
文件操作的第二个命令式file,file有许多选项的常用命令,可以用来进行文件操作也可以检索文件信息。
15.错误异常
异常是导致脚本被终止的事件。
很多情况下,错误信息提供了足够的信息指出哪里以及为什么发生了错误。如果错误发生在一组深层套嵌的过程调用中,仅仅给出错误信息还不能为指出哪里发生了错误提供足够信息。为了帮助指出错误的位置,当TCL撤销程序中运行的命令时,创建了一个跟踪栈,并且把这些跟踪栈存储到全局变量errorInfo中。
Catch命令可以俘获所有的异常,不仅是错误。Catch命令的返回值表示是那种情况的异常。
16.深入
利用array命令可以查询一个数组变量中已经定义了的元素的信息。
Info命令提供了查看TCL解释器信息的手段,有超过一打的选项。
例如info exist a
info global
tcl命令提供了trace命令来跟踪一个或多个变量。