?2003 SPRINGSOFT INC.
Laker 3.0 TCL training course
林岡正Max Lin
?2003 SPRINGSOFT INC.
摘要
!TCL簡介
!TCL基礎
!Laker TCL延伸!實例解說
!實驗
?2003 SPRINGSOFT INC.
TCL 簡介
"TCL -tickle, tee-see-ell
"T ool C ommand L anguage 的縮寫
"以字串(String )為基礎的程式語言
"一種與UNIX shell language 類似的工具語言,它本身也是一種Shell 語言(/usr/local/bin/tclsh)也就是說你可以在程式的第一行加上
#!/usr/local/bin/tclsh
就可以在提示符號下直接執行你所寫的TCL 程式
"或是在tclsh 下使用source program.tcl 來執行
"你可以使用TCL 語法來組合Laker 的指令來製作屬於你自己的功能,增進工作效率
"在Laker 中你可以把TCL 所寫成的功能加到所寫成的功能加到功能表的選項之功能表的選項之功能表的選項之中中或設定成或設定成快速鍵快速鍵快速鍵以方便使用以方便使用
?2003 SPRINGSOFT INC.
#TCL 程式是一連串的指令,不同的指令之間以換行(enter )或分號(;)做區隔,下一行若是接續上一行則需以『\』做為行尾。行首行首行首若有『#』則表示此行是註解,TCL 會忽略掉。
#在指令之中以空白區分不同的變數,指令列中第一個字是指令,之後接著的是參數,指令列所傳回來的值是字串。
–Command argument1 argument2….
範例:
set a 22$設定變數a 的值為22
!不需事先宣告變數a , TCL 中的變數在第一次設定值以後就會存在unset a $刪除變數a
set x 4; set y “Hello ”%用分號分開兩個指令set text “This line is split into \%接續下一行two lines”
# This line is comment 不執行這一行
*注意『\」之後不能有空白字元(常見錯誤)
TCL 基本語法
?2003 SPRINGSOFT INC.
?語法: $varName or ${varName }
?使用『$』符號代表將變數值取出,用大括號可區隔變數名稱與其後之字元,以避免混淆。變數的名稱由字元、數字及底線所組成。請仔細比較下列範例之異同
範例結果
set b 6666
set a b b
set a $b 66
set a $b+$b+$b 66+66+66
set a $b.366.3
set w ${a}fix 66.3fix
若要保留『$』字元,則需在『$』前加上『\』
set a \$b $b
&可以用info exists a 檢查變數 a 是否存在,存在則傳回1,不存在則傳回0
TCL 基本語法: 變數的使用
?2003 SPRINGSOFT INC.
TCL 基本語法: 中括號[ ]
?語法: [script ]
?將中中括號中的指令執行之後傳回執行的結果
範例
結果set b 8
8set a [expr $b+2]
10set a "b-3 is [expr $b-3]"
b-3 is 5#若要保留『[]』字元,則需在『[]』前加上『\』
set a \[expr\]
[expr]
?2003 SPRINGSOFT INC.
?語法: {script }
?大括號{ }的作用和雙引號類似,都是做grouping 的動作,但是它會免去大括號中一切的替換和計算,把大括號中都當成字串範例
結果set b 8
8set a {[expr $b+2]}
[expr $b+2]set a [expr $b+2]
10set a "b-3 is [expr $b-3]"
b-3 is 5set w ${b}fix 8fix
?一般常犯的錯誤是在『}』『{』兩個符號之間沒有填入空白符號,例如if { $x<1 }{ puts “X=$x”}就會有語法錯誤TCL 基本語法: 大括號{ }
?2003 SPRINGSOFT INC.
?TCL在分析語法中參數(argument)部分時會自動加上雙引號“argument ”:
C:x = 4; y = x+10y $14
TCL:set x 4; set y x+10y $“x+10”
?雙引號同時能避免『;』的作用,但其中的替代與計算都會被執行set a “x is $x; y is $y”$x is 4; y is x+10
?當大刮號被雙引號包起來的時候,大刮號免去替代計算的功能就會被關掉
Set x CurlyBraces
set a “x is {$x}”$x is {CurlyBraces}
TCL 基本語法: 雙引號“”
?2003 SPRINGSOFT INC.
?語法: expr function
?expr 會將function 所表示的計算式加以替換和計算,並傳回計算結果
範例結果
set b 5; set a 8 5 8
expr ($b*4) -317
expr $b <= 20
expr $a *cos(2*$b)-6.71257
!注意(易犯錯)
expr 122/10 $12
expr 122.0/10.0 $12.2
expr 會自動依據計算式中的數值調整資料型態,當你要使
用整數運算時請以整數表示,expr 會將小數點以下捨去
?2003 SPRINGSOFT INC.
?可用tcl_precision 變數來控制expr 計算結果的精確度,最大值可以設定到17,此一精確度足以讓數值在字串及IEEE double precision number 之間互相轉換沒有lost .
範例
結果expr 1/3
0expr 1.0/3.0
0.333333set tcl_precision
10expr 1.0/3.00.3333333333
?2003 SPRINGSOFT INC.
?語法: incr variable increment
?incr 相當於set variable [expr $variable + increment]指令increment 如果沒寫,內定值就是1
範例
結果set a 3
3incr a
4incr a 6
10incr a -28
?2003 SPRINGSOFT INC.
?整數(integer)預設都是十進制(decimal)
?如果第一個字元是『0』,則是八進制(octal)
?如果第一個字元是『0x』,則是十六進制(hexadecimal)範例:
243, 0363, 0xF3
expr0xF3 * 1 $243
實數可用以下之表示法表示
5.5 3.7e+66E4 3.
TCL 基本語法: 數值表示法
?2003 SPRINGSOFT INC.
?以空白區隔的一連串元素(字串或數值)我們稱之為List:set color “red green blue”
?我們也可以用大括號或雙引號做元素中的群組:
a b {c d e} f(4 words)
{a b} { b {c d }} e {f g} H (5 words)
“ a b { c d e } f g {h I }”(6 words)
!注意:所有的指令List的index 都是從0開始。
關於list的相關指令的使用方式如下:
list將其後的元素連結成一個新的list
set a [list a b c] $ a = { a b c }
?2003 SPRINGSOFT INC.
lindex keyword: 0, end(0是第一個,end是最後一個,可用end-N來倒數回來)lindex “a b c”0 $ a 傳回list中第0 個元素
lrange傳回list中第n 到第m 個元素
$lrange list n m
lrange “a b c d” 2 end $ c d (第2個到最後一個) lappend 附加另一list或字串到原來的list上
set CellList“INV”$“INV”
lappend CellList“AND2 NOR2”$“INV AND2 NOR2”linsert 插入另一個list
$linsert list index arg arg …
linsert“a d” 1 b c $“a b c d”
linsert“a d” 1 “b c”$“a {b c} d”
?2003 SPRINGSOFT INC.
lsort排序list中的元素,傳回一新的list
$lsort?switch? list
switch: -ascii, -integer, -real, -dictionary
以ASCII字元、整數、實數、字典順序排序
-increasing 遞增(default),-decreasing 遞減
-index 若list中的元素也是個list,可指定以第i元素來排序
lsort–ascii–decreasing “John Mary Amanda Dave”
$“Mary John Dave Amanda”
lsort–integer –index 0“{4 a}{2 b}{3 c}{1 d}”
${1 d} {2 b} {3 c} {4 a}
lsort–ascii–index 1“{4 a}{2 b}{3 c}{1 d}”
${4 a} {2 b} {3 c} {1 d}
?2003 SPRINGSOFT INC.
lreplace 替換掉list中某一段的元素,傳回一新的list $lreplace list i j arg arg…
lreplace{a b c d} 1 2 Z Y X $ a Z Y X d
lreplace{a b c d} 1 2 “”$ a d 拿掉1到2之間的元素llength計算list 中的元素個數
llength{a b c d} $4
lsearch搜尋list中的元素,傳回其index
$lsearch?mode? list value
lsearch–exact {a b c d} c $2
mode : -exact 表示尋找完全相同的
–regexp 表示使用regular expression 來尋找如果沒有找到符合的元素則則傳回-1
?2003 SPRINGSOFT INC.
split將一個連續的字串以指定的字元切開成為新的list
語法:split string?splitChars?
set y /u/home/tcl/lists.tcl
split $y / ${} u home tcl lists.tcl
split abcdef “”$ a b c d e f
join的動作與split相反,可以將list中所有的元素以指定的字元串接起來成一新的字串
語法:join list?joinString?
set x {5 12 7}
expr[join $x +] $24 (expr5+12+7 ) concat list1 list2 …將list1 list2 .. 等等list 中的元素展開後串起來成新的list (展開一層{})
concat{a b c} {d e} f {g h} { {i j} k}
$ a b c d e f g h {i j} k
?2003 SPRINGSOFT INC.
TCL 基本資料型態: Array
?TCL的陣列(array)的語法如下:
set arr(index) value
set arr(i,j) value
?取的陣列元素的值一樣是使用$:
set content$arr(index)
!Index 可以是數值也可以是任意的字串
set arr(question1) “Answer1”
!關於array的相關指令的使用
array exists arr $arr是否為一array變數array get arr?pattern?$將array中index對應到
pattern的元素組成一個list傳回來
array set arr list$將list轉換成array
array size arr$傳回array的大小
?2003 SPRINGSOFT INC.
字串是TCL的基本資料型態,常用處理字串的指令有string scan format
string option argument ……
範例:
set name “Laker TCL”
?計算字串的長度length
string length $name $9
?大小寫轉換(大寫toupper 小寫tolower) string toupper$name $LAKER TCL ?比較兩個字串是否相同
string equal $name $name $1
string equal abc def $0
TCL 基本資料型態: 字串string
?2003 SPRINGSOFT INC.
set name “Laker is Laker”
?截掉字串的頭尾
string trim $name Laker $“is”
?截掉字串的頭
string trimleft$name Laker $“is Laker”?截掉字串的尾
string trimright$name Laker $“Laker is”?傳回字串中某一段
string range $name 0 6 $Laker i
?判斷字串的內容型態
string is integer $name $0
string is ascii$name $1
常用型態:ascii, integer, space, alnum, double