原创 tcl学习日志

2009-10-29 09:25 5010 3 3 分类: 工程师职场

没有系统的学习过tcl,第一份资料,记下一些要点,以便以后温故知新。


1,一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的:
set a 1 set b 2

set a 1;set b 2


2,TCL解释器在分析命令时,把所有的命令参数都当作字符串看待


3,命令置换是由[]括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所代替。例如:
%set y [expr $x+100]
110
y的值是110,这里当TCL解释器遇到字符'['时,它就会把随后的expr作为一个命令名,从而激活与expr对应的C/C++过程,并把'expr'和变量置换后得到的'10+110'传递给该命令过程进行处理。
如果在上例中我们去掉[],那么TCL会报错。因为在正常情况下,TCL解释器只把命令行中的第一个单词作为看作命令,其他的单词都作为普通字符串处理,看作是命令的参数。
注意,[]中必须是一个合法的TCL脚本,长度不限。[]中脚本的值为最后一个命令的返回值,


4,tcl中的双引号相当于perl中的双引号,而tcl中的花括号相当于perl中的单引号。
5,tcl中的数组和perl的哈希比较像


6,puts显示变量的值,unset删除变量,可以删除多个,之间空格分隔


7,append命令把文本加到一个变量的后面,例如:


8,incr命令把一个变量值加上一个整数。incr要求变量原来的值和新加的值都必须是整数。
9,expr是tcl的一个命令,这个命令的参数是一个数学表达式,用来计算这个表达式的值。
10,list在tcl里面是用来表示集合的。算是perl中的列表吧。
list这个概念在TCL中是用来表示集合的。TCL中list是由一堆元素组成的有序集合,list可
以嵌套定义,list每个元素可以是任意字符串,也可以是list。下面都是TCL中的合法的list:


11,语法:lindex list index 返回list的第index个(0-based)元素。例


12,语法:llength list 返回list的元素个数。例


13,语法:linsert list index value ?value...? 返回一个新串,新串是把所有的value参数值插入list的第index个(0-based)元素之前得到。


14,语法:lreplace list first last ?value value ...? 返回一个新串,新串是把list的第firs (0-based)t到第last 个(0-based)元素用所
有的value参数替换得到的。如果没有value参数,就表示删除第first到第last个元素。例:


15,语法:lrange list first last 返回list的第first (0-based)到第last (0-based)元素组成的串,如果last的值是end。就是从第first个
    直到串的最后。  类似perl中的substr
   
16,语法:lappend varname value ?value...? 把每个value的值作为一个元素附加到变量varname后面,并返回变量的新值,如果varname不
    存在,就生成这个变量。例
17,语法:lsort ?options? list 这个命令返回把list排序后的串。options可以是如下值:


18,语法:split string ?splitChars? 把字符串string按分隔符splitChars分成一个个单词,返回由这些单词组成的串。如果splitChars
    是一个空字符{},string被按字符分开。如果splitChars没有给出,以空格为分隔符。例:
    这个和perl的顺序是反的。
19,语法:join list ?joinString? join命令是命令的逆。这个命令把list的所有元素合并到一个字符串中,中间以joinString分开。缺省
    的joinString是空格。例:
20,tcl中的控制if {}{
                     }
21,在循环体中,可以用break和continue命令中断循环。其中break命令结束整个循环过程,并从循环中跳出,continue只是结束本次循环。


22,TCL支持过程的定义和调用,在TCL中,过程可以看作是用TCL脚本实现的命令,效果与TCL的固有命令相似。我们可以在任何时候使用
   proc命令定义自己的过程,TCL中的过程类似于C中的函数。  % proc add {x y } {expr $x+$y}
23,TCL中,局部变量和全局变量可以同名,两者的作用域的交集为空:局部变量的作用域是它所在的过程的内部;全局变量的作用域则
  不包括所有过程的内部。这一点和C语言有很大的不同,确实有很大的不同。
24,upvar命令使得用户可以在过程中对全局变量或其他过程中的局部变量进行访问。 upvar命令的第一个参数otherVar是我们希望以
   引用方式访问的参数的名字,第二个参数myVar 是这个过程中的局部变量的名字,一旦使用了upvar 命令把otherVar 和myVar 绑定,那么
   在过程中对局部变量myVar 的读写就相当于对这个过程的调用者中otherVar 所代表的局部变量的读写 


25,因为TCL把所有的输入都当作字符串看待,所以TCL提供了较强的字符串操作功能,TCL中与字符串操作有关的命令有:string、format、
    regexp、regsub、scan等。
26,scan命令可以认为是format命令的逆,其功能类似于ANSI C中的sscanf函数。它按format提供的格式分析string字符串,然后把结果存
    到变量varName中,注意除了空格和TAB键之外,string 和format中的字符和'%'必须匹配 
   
27,语法:regexp ?switchs? ?--? exp string ?matchVar?\ ?subMatchVar subMatchVar...? regexp命令用于判断正规表达式exp是否全
    部或部分匹配字符串string,匹配返回1,否则0。


28,语法:regsub ?switchs? exp string subSpec varname regsub的第一个参数是一个整个表达式,第二个参数是一个输入字符串,这一点和regexp命令完全一样,也是当匹配时返回1,否则返回0。不过regsub用第三个参数的值来替换字符串string中和正规表达式匹配的部分,第四个参数被认为是一个变量,替换后的字符串存入这个变量中。例如:
% regsub there "They live there lives " their x 1 % puts $x They live their lives
这里there被用their替换了。


29,string这个命令有很多的选项,这个用的时候去看吧


30,proc tgrep { pattern filename} { set f [open $filename r] while { [gets $f line ] } { if {[regexp $pattern $line]} { puts stdout $line } } close $f }
以上过程非常象UNIX的grep命令, 你可以用两个参数调用它,一个是模式,另一个是文件名,tgrep将打印出文件中所有匹配该模式的行。
     

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条