【文章內(nèi)容簡介】
e {1 7 8 2 4 5 6} 3 end2 4 5 6 lappend命令:語法:lappend varname value ?value...?把每個value的值作為一個元素附加到變量varname后面,并返回變量的新值,如果varname不存在,就生成這個變量。例:% lappend a 1 2 31 2 3% set a1 2 3 lsearch 命令:語法:lsearch ?exact? ?glob? ?regexp? list pattern返回list中第一個匹配模式pattern的元素的索引,如果找不到匹配就返回1。exact、glob、 regexp是三種模式匹配的技術(shù)。exact表示精確匹配;glob的匹配方式和string match命令的匹配方式相同,將在后面第八節(jié)介紹string命令時介紹;regexp表示正規(guī)表達式匹配,將在第八節(jié)介紹regexp命令時介紹。缺省時使用glob匹配。例:% set a { how are you } how are you % lsearch $a y*2% lsearch $a y?1 lsort命令:語法:lsort ?options? list這個命令返回把list排序后的串。options可以是如下值:ascii 。dictionary 按字典排序,與ascii不同的地方是: (1)不考慮大小寫 (2)如果元素中有數(shù)字的話,數(shù)字被當作整數(shù)來排序. 因此:bigBoy排在bigbang和bigboy之間, x10y 排在x9y和x11y之間.integer 把list的元素轉(zhuǎn)換成整數(shù),按整數(shù)排序.real 把list的元素轉(zhuǎn)換成浮點數(shù),按浮點數(shù)排序.increasing 升序(按ASCII字符比較)decreasing 降序(按ASCII字符比較)mand mand TCL自動利用mand 命令把每兩個元素一一比較,然后給出排序結(jié)果。 split命令:語法:split string ?splitChars?把字符串string按分隔符splitChars分成一個個單詞,返回由這些單詞組成的串。如果splitChars是一個空字符{},string被按字符分開。如果splitChars沒有給出,以空格為分隔符。例:% split .how are you% split how are youhow are you% split how are you {}h o w { } a r e { } y o u join命令語法:join list ?joinString? join命令是命令的逆。這個命令把list的所有元素合并到一個字符串中,中間以joinString分開。缺省的joinString是空格。例:% join {h o w { } a r e { } y o u} {}how are you% join {how are you} .3 控制流TCL中的控制流和C語言類似,包括if、while、for、foreach、switch、break、continue等命令。下面分別介紹。 if命令語法: if test1 body1 ?elseif test2 body2 elseif.... ? ?else bodyn?TCL先把test1當作一個表達式求值,如果值非0,則把body1當作一個腳本執(zhí)行并返回所得值,否則把test2當作一個表達式求值,如果值非0,則把body2當作一個腳本執(zhí)行并返回所得值……。例如: if { $x0 } { ..... }elseif{ $x==1 } { ..... }elseif { $x==2 } { .... }else{ ..... }注意,上例中39。{39。一定要寫在上一行,因為如果不這樣,TCL 解釋器會認為if命令在換行符處已結(jié)束,下一行會被當成新的命令,從而導(dǎo)致錯誤的結(jié)果。在下面的循環(huán)命令的書寫中也要注意這個問題。書寫中還要注意的一個問題是if 和{之間應(yīng)該有一個空格,否則TCL解釋器會把39。if{39。作為一個整體當作一個命令名,從而導(dǎo)致錯誤。 循環(huán)命令:while 、for、 foreach while命令語法為: while test body參數(shù)test是一個表達式,body是一個腳本,如果表達式的值非0,就運行腳本,直到表達式為0才停止循環(huán),此時while命令中斷并返回一個空字符串。例如: 假設(shè)變量 a 是一個鏈表,下面的腳本把a 的值復(fù)制到b: set b set i [expr [llength $a] 1] while { $i=0}{ lappend b [lindex $a $i] incr i 1 } for命令語法為: for init test reinit body參數(shù)init是一個初始化腳本,第二個參數(shù)test是一個表達式,用來決定循環(huán)什么時候中斷,第三個參數(shù)reinit是一個重新初始化的腳本,第四個參數(shù)body也是腳本,代表循環(huán)體。下例與上例作用相同: set b for {set i [expr [llength $a] 1]} {$i=0} {incr i 1} { lappend b [lindex $a $i] } foreach命令這個命令有兩種語法形式1。 foreach varName list body第一個參數(shù)varName是一個變量,第二個參數(shù)list 是一個表(有序集合),第三個參數(shù)body是循環(huán)體。每次取得鏈表的一個元素,都會執(zhí)行循環(huán)體一次。 下例與上例作用相同: set b foreach i $a{ set b [linsert $b 0 $i] }2。 foreach varlist1 list1 ?varlist2 list2 ...? Body這種形式包含了第一種形式。第一個參數(shù)varlist1是一個循環(huán)變量列表,第二個參數(shù)是一個列表list1,varlist1中的變量會分別取list1中的值。body參數(shù)是循環(huán)體。 ?varlist2 list2 ...?表示可以有多個變量列表和列表對出現(xiàn)。例如:set x {}foreach {i j} {a b c d e f} { lappend x $j $i}這時總共有三次循環(huán),x的值為b a d c f e。set x {}foreach i {a b c} j {d e f g} { lappend x $i $j}這時總共有四次循環(huán),x的值為a d b e c f {} g。set x {}foreach i {a b c} {j k} {d e f g} { lappend x $i $j $k}這時總共有三次循環(huán),x的值為a d e b f g c {} {}。 break和continue命令 在循環(huán)體中,可以用break和continue命令中斷循環(huán)。其中break命令結(jié)束整個循環(huán)過程,并從循環(huán)中跳出,continue只是結(jié)束本次循環(huán)。 switch 命令和C語言中switch語句一樣,TCL中的switch命令也可以由if命令實現(xiàn)。只是書寫起來較為煩瑣。 switch命令的語法為: switch ? options? string { pattern body ? pattern body ...?} 第一個是可選參數(shù)options,表示進行匹配的方式。TCL支持三種匹配方式:exact方式,glob方式,regexp方式,缺省情況表示glob方式。exact方式表示的是精確匹配,glob方式的匹配方式和string match 命令的匹配方式相同(第八節(jié)介紹),regexp方式是正規(guī)表達式的匹配方式(第八節(jié)介紹)。第二個參數(shù)string 是要被用來作測試的值,第三個參數(shù)是括起來的一個或多個元素對,例:switch $x { a b {incr t1} c {incr t2} default {incr t3} }其中a的后面跟一個39。-39。表示使用和下一個模式相同的腳本。default表示匹配任意值。一旦switch命令 找到一個模式匹配,就執(zhí)行相應(yīng)的腳本,并返回腳本的值,作為switch命令的返回值。 eval命令eval命令是一個用來構(gòu)造和執(zhí)行TCL腳本的命令,其語法為:eval arg ?arg ...?它可以接收一個或多個參數(shù),然后把所有的參數(shù)以空格隔開組合到一起成為一個腳本,然后對這個腳本進行求值。例如:%eval set a 2 。set b 44 source命令source命令讀一個文件并把這個文件的內(nèi)容作為一個腳本進行求值。例如:source e:/tclamp。c/ 注意路徑的描述應(yīng)該和UNIX相同,使用39。/39。而不是39。\39。4 過程(procedure)TCL支持過程的定義和調(diào)用,在TCL中,過程可以看作是用TCL腳本實現(xiàn)的命令,效果與TCL的固有命令相似。我們可以在任何時候使用proc命令定義自己的過程,TCL中的過程類似于C中的函數(shù)。 過程定義和返回值TCL中過程是由proc命令產(chǎn)生的:例如:% proc add {x y } {expr $x+$y}proc命令的第一個參數(shù)是你要定義的過程的名字,第二個參數(shù)是過程的參數(shù)列表,參數(shù)之間用空格隔開,第三個參數(shù)是一個TCL腳本,代表過程體。 proc生成一個新的命令,可以象固有命令一樣調(diào)用:% add 1 2 3 在定義過程時,你可以利用return命令在任何地方返回你想要的值。 return命令迅速中斷過程,并把它的參數(shù)作為過程的結(jié)果。例如:% proc abs {x} {if {$x = 0} { return $x }return [expr $x]}過程的返回值是過程體中最后執(zhí)行的那條命令的返回值。 局部變量和全局變量 對于在過程中定義的變量,因為它們只能在過程中被訪問,并且當過程退出時會被自動刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過程的內(nèi)部;全局變量的作用域則不包括所有過程的內(nèi)部。這一點和C語言有很大的不同. 如果我們想在過程內(nèi)部引用一個全局變量的值,可以使用global命令。例如:% set a 44% proc sample { x } { global a incr a return [expr $a+$x]}% sample 38%set a5 全局變量a在過程中被訪問。在過程中對a的改變會直接反映到全局上。如果去掉語句global a,TCL會出錯,因為它不認識變量a. 缺省參數(shù)和可變個數(shù)參數(shù)TCL還提供三種特殊的參數(shù)形式:首先,你可以定義一個沒有參數(shù)的過程,例如:proc add {} { expr 2+3}其次,可以定義具有缺省參數(shù)值的過程,我們可以為過程的部分或全部參數(shù)提供缺省值,如果調(diào)用過程時未提供那些參數(shù)的值,那么過程會自動使用缺省值賦給相應(yīng)的參數(shù)。和C\C++中具有缺省參數(shù)值的函數(shù)一樣,有缺省值的參數(shù)只能位于參數(shù)列表的后部,即在第一個具有缺省值的參數(shù)后面的所有參數(shù),都只能是具有缺省值的參數(shù)。例如:proc add {val1 {val2 2} {val3 3}}{ expr $val1+$val2+$val3 }則:add 1 //值為6add 2 20 //值為25add 4 5 6 //值為15另外,TCL的過程定義還支持可變個數(shù)的參數(shù),如果過程的最后一個參數(shù)是args, 那么就表示這個過程支持可變個數(shù)的參數(shù)調(diào)用。調(diào)用時,位于args以前的參數(shù)象普通參數(shù)一樣處理,但任何附加的參數(shù)都需要在過程體中作特殊處理,過程的局部變量args將會被設(shè)置為一個列表,其元素就是所有附加的變量。如果沒有附加的變量,args就設(shè)置成一個空串,下面是一個例子: proc add { val1 args } { set sum $val1 foreach i $args { incr sum $i } return $sum }則: add 2 //值為2 add 2 3 4 5 6 //值為20 引用:upvar命令語法:upvar ?level? otherVar myVar ?otherVar myVar ...?upvar命令使得用戶可以在過程中對全局變量或其他過程中的局部變量進行訪問。 upvar命令的第一個參數(shù)otherVar是我們希望以引用方式訪問的參數(shù)的名字,第二個參數(shù)myVar 是這個過程中的局部變量的名字,一旦使用了upvar 命令把otherVar 和myVar 綁定,那么在過程