這一篇是研究所時候寫的,幸好還找的到,所以把它貼出來。
TCL (Tool Command Language),TCL念做"tickle",TCL本身不支援物件導向,但是可以和其他物件導向語言結合。
顯示字串到console用puts
variable
設定變數用set:
set varName? value?
set a 10 puts $a事實上在Tcl中,沒有字串與數字的區分。也就是說:
set Lab good
set Lab “good”
這兩行指令會是一樣的結果。
comment
Tcl的注解必須以#開頭,而Tcl以換行(\n)和分號 (;)為命令的結束,所以如果想在命令後面做註解,就必須寫成 ;#。
puts "test only" ;# test only
data type
Tcl和shell script一樣並不需要是先宣告任何資料型態,其資料型態會隨其給的值變動。
Quotes and Curly braces
雙引號把引號內的文字串成字串,變數還是會被解譯(substitutions)。
set a "Hello World!"
"{", "}" curly braces,和雙引號一樣,只是變數不會被解釋。
set a "Hello World!" puts "$a" puts {$a}
"[", "]"就像shell中的`會把括號內的文字當成指令執行,而執行結果則會取代整個[]。
set x 5 set y 10 set z "$x + $y is [expr $x + $y]"
另外backslash "\",會讓substitutions失效,如同其他language一樣,tcl也有提供Backslash Sequence。
String Output \b Backspace \f clear screen \n New Line \r Carriage Return \t Tab \v Vertical Tab
Control
if {expr1} {body1} elseif {expr2} {body2} else {body}
set x 1 if {$x == 2} { puts "$x is 2" } else { puts "$x is not 2" } if {$x != 1} { puts "$x is != 1" } else { puts "$x is 1" }
switch
Evaluate one of several scripts, depending on a given value
switch ?option? string {body}
% set x 1 1 % switch $x { 1 {puts "match 1"} 2 {puts "match 2"} default {puts "no match"} } ;# match 1 --> result
% set x 10 10 % switch $x { 1 {puts "match 1"} 2 {puts "match 2"} default {puts "no match"} } # no match ---> result% switch -regexp $x { 1 {puts "match 1"} 2 {puts "match 2"} default {puts "no match"} } # match 1 ---> result
loop
while {test} {body}
set x 0 while {$x < 5} { set x [expr $x + 1] if {$x > 7} break if "$x > 3" continue puts "x is $x" }
for {start} {test} {next} {body}
for {set x 1} {$x < 10} {incr x 2} { puts "x = $x" }
新增命令 -- procedure
TCL可以使用proc建立一個新的命令,其格式如下。
proc name { args } {
body
}proc會建立一個名為name的命令,並且攜帶參數args,以及程式碼body。如果最後一個參數名稱為args,那就類似C的不定參數"..."。
範例:
proc sum {arg1 arg2} { set x [expr {$arg1 + $arg2}]; return $x } proc printall {args} { foreach j $args { puts "$j" } } proc x {a {b 2}} { #give default vaule for b puts $a puts $b }
Associative Array
associative array其實就是hash table,給一個Key(Tcl稱為element)會傳回一個value。其範例如下:
set A(1) "one" set A(2) "two" set A(Three) "three"array set B { 1 "one" 2 "two" 3 "three" } array names A foreach thing [array names A] { puts "$A($thing)" }
array set arrayName list
array size arrayName建立陣列,list 必須以 key value形式組成。
array names arrayName ?mode? ?pattern?傳回陣列大小。
如果只有array names arrayName將會回傳所有的key,否則您也可以用正規表示式搜尋key是否存在。
array unset arrayName ?pattern?
如果沒有指明pattern,會將整個array註銷,否則會比對pattern和key是否相同,如果有會註銷該元素 (key),否則會回傳空字串(empty string)。
array exists arrayName
如果陣列存在會回傳1,否則會回傳0。
array get arrayName ?pattern?
如果沒有指明pattern會將array整個以key value的形式傳回。如果有指明pattern則會搜尋是否有符合的key,有的話會一樣以key value傳回,否則傳回空字串。
- array statistics arrayName
會將array的資訊顯示出來(distribution of data within the hash table)。
array startsearch arrayName
這是用來初始化搜尋的指令,會回傳search-ID,可用於array nextelement和array donesearch指令。
array nextelement arrayName searchId
傳回array的key。如果array被新增或刪除,則Tcl會自動呼叫array donesearch終止目前的搜尋。
array donesearch arrayName searchId
終止array的搜尋,並且註銷array的search-ID。
array anymore arrayName searchId