收藏 分享(赏)

Laker TCL 基础训练教材.pdf

上传人:精品资料 文档编号:10397711 上传时间:2019-11-07 格式:PDF 页数:99 大小:1.29MB
下载 相关 举报
Laker TCL 基础训练教材.pdf_第1页
第1页 / 共99页
Laker TCL 基础训练教材.pdf_第2页
第2页 / 共99页
Laker TCL 基础训练教材.pdf_第3页
第3页 / 共99页
Laker TCL 基础训练教材.pdf_第4页
第4页 / 共99页
Laker TCL 基础训练教材.pdf_第5页
第5页 / 共99页
点击查看更多>>
资源描述

1、Laker TCL Basic Training Course 2011 TCL - tickle Tool Command Language的縮寫 以字(String)為基礎的程式語言 或是在tclsh下使用 source program.tcl 執 你可以使用 TCL 語法組合 Laker 的指,製作屬於你自己的功能,增進工作效 在Laker中你可以把TCL 所寫成的功能加到功能表的選項之中或設定成快速鍵以方使用 TCL 簡介 TCL是與UNIX shell language類似的工具語言,它本身也是一種 Shell 語言(/usr/bin/tclsh) 也就是說你可以在程式的第一行加上

2、(#!/usr/local/bin/tclsh),就可以在提示符號下直接執行你所寫的TCL程 式 Example:hello.tcl TCL file: #!/usr/bin/tclsh puts “Hello!” Enter in terminal: chmod +x hello.tcl hello.tcl TCL 簡介cont. Result in terminal: Hello!TCL 基本語法 TCL程式是一連串的指令,不同的指令之間以換行 ( enter ) 或分號 ( ; ) 做區隔,下一行若是接續上一行則需以右斜線 ( ) 做為行尾,行首若有井字號 ( # ) 則表示此行是註解,

3、TCL會忽略掉。 在指令之中以空格來區分不同的變數,指令列中第一個字是指令,之後接著的是參數,指令列所傳回來的值是字串。 Command argument1 argument2 . Example: 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 這行不執行 注意斜線 ( ) 之後不能有空白字

4、元(常見錯誤) Syntax:$varName or $varName 使用符號代表將變數值取出,用大括號可區隔變數名稱與其後之字元,以避免混淆。變數的名稱由字元、數字及底線所組成。請仔細比較下列範例之異同 範例結果 set b 66 66 set a b b set a $b 66 set a $b+$b+$b 66+66+66 set a $b$b 6666 set w $afix 6666fix 若要保留$字元,則需在$前加上 set a $b $b 可以用 info exists a 檢查變數 a 是否存在,存在則傳回1,不存在則傳回0 TCL 基本語法:變數的使用 Syntax:sc

5、ript 將中括號中的指令執行之後,傳回執行的結果 範例結果 set b 8 8 set a expr $b+2 10 set a “b+2 = expr $b+2“ b+2 = 10 若要保留字元,則需在前加上 set a expr expr TCL 基本語法:中括號 Syntax:script 大括號 的作用和雙引號類似,都是做grouping的動作,但是它會免去大括號中一切的替換和計算,把大括號中都當成字串 範例結果 set b 8 8 set a expr $b+2 expr $b+2 set a expr $b+2 10 set a “b+2 = expr $b+2“ b+2 = 1

6、0 set w $bfix 8fix 一般常犯的錯誤是在兩個符號之間沒有填入空白符號 例如 if $x1 puts “X=$x” 語法錯誤 if $x1 puts “X=$x” 語法修正 TCL 基本語法:大括號 Syntax: “script” TCL在分析語法中參數(argument)部分時會自動加上雙引號“ argument ”: C: x = 4; y = x+10 y 14 TCL: set x 4; set y x+10 y “x+10” 雙引號同時能避免;的作用,但其中的替代與計算都會被執行 set a “x is $x; y is $y” x is 4; y is x+10 當

7、大括號被雙引號包起來的時候,大括號免去替代計算的功能就會被關掉 set x CurlyBraces set a “x is $x” x is CurlyBraces TCL 基本語法:雙引號“” Syntax:expr function expr 會將function所表示的計算式加以替換和計算,並傳回計算結果 範例結果 set b 5 ; set a 8 5 8 expr ($b*4) - 3 17 expr $a * cos(2*$b) -6.71257 注意(易犯錯) expr 122/10 12 (整數相除仍為整數) expr 122.0/10.0 12.2 expr (122*1.0

8、)/10.0 12.2 expr 會自動依據計算式中的數值調整資料型態,當你要使用整數運算時請以整數表示, expr 會將小數點以下捨去 TCL 基本語法:expr 可用tcl_precision 變數來控制expr計算結果的精確度,最大值可以設定到16,此一精確度足以讓數值在字串及IEEE double precision number之間互相轉換沒有lost 範例結果 expr 1/3 0 expr 1.0/3.0 0.333333 set tcl_precision 10 10 expr 1.0/3.0 0.3333333333(前0後10) set tcl_precision 3 3

9、expr 1.0/3.0 0.333 (前0後3) 精確度為不含小數點之位數 TCL 基本語法:expr cont. Syntax:incr variable increment incr 相當於 set variable expr $variable + increment指令,increment如果沒寫,內定值就是 1 範例結果 set a 3 3 incr a 4 incr a 6 10 incr a -2 8 TCL 基本語法:incr 整數(integer)預設都是十進制 (decimal) 如果第一個字元是0零,則是八進制 (octal) 如果第一個字元是0x,則是十六進制 (he

10、xadecimal) Example: 243, 0363, 0xF3 expr 0xF3 * 1 243 實數可用以下之表示法表示 5.5 3.7e+6 6E4 3. TCL 基本語法:數值表示法Syntax:proc Name argument1 argument2 TCL command body 傳回的值是這個程序之中的最後一個指令的結果。 若在程序之中使用return 指令的話則是傳回你所要傳出來的結果 Example: proc sum A B set r expr $A+$B return $r 使用上面所完成的程序可直接以下列指令呼叫即可 set result sum 1 2

11、計算出之結果3 即為傳回的值 注意:proc之中不要再寫入另一個proc TCL 基本執行單位:程序procedure在Laker 上執行TCL 在Laker main window可以直接執行TCL的語法 或在 Laker的命令欄執行source laker.tcl 你可以在啟動 Laker 時就自動啟動 TCL 程式 只要在 laker.rc 的設定檔中加入 TCL 程式即可 PS. 修改laker.rc時,laker必須是在關閉的狀況下 . SourceTcl Source1 = ./example.tcl Source2 = /home/abc/leoBlockLabel.tcl La

12、ker 自動啟用TCL 的方法 Laker會將使用者所有的動作以TCL的語法記錄下來,使用者亦可使用相同之TCL指令控制Laker,以類似巨集的方式使用,增進工作效率 在 Main Window的訊息欄中可以看到所執行的動作的TCL指令延伸(如下圖) 你也可以在你的工作目錄下找到 lakerLog的子目錄,所執行過的指令都會記錄在 /lakerLog/laker.cmd 如果想要執行此laker.cmd,也可以直接執行command如下: laker play /lakerLog/laker.cmd Laker TCL Extensions Laker Extensions 提供使用者控制La

13、ker的動作 lakerOpenDesign lakerLoadDesign GUI Extensions 提供使用者控制圖形介面的指令 gtCreateIntField gtCreateRadioField Database Extensions 提供使用者直接處理記憶體中資料的指令 dbCVExist dbGetLayerNameByLayerId 優點:不經過圖形介面處理,程式執行速度較快 缺點:無法回復到動作之前(無法直接undo,在Laker32v4之後提供 指令,來做到undo的功能) Laker TCL Extensions cont.Laker TCL Command Exam

14、ple 用 lakerCreateRect 產生矩形 lakerCreateRect layerName OD -point (0.0,0.0) (10.0,10.0)請依序按下列的範例進行練習: 1. set a 10 10 (設a為10) 2. set b 22; set c 8 8( 設b=22,c=8, ”;”等於換行) 3. set a 10 (取變數a值) 4. echo $a 10 (呼叫變數a ) 5. puts $a 10 (輸出至terminal ) 6. puts “$a $b $c” 10 22 8 (將值取出並輸出至terminal ) 7. puts $a $b $

15、c $a $b $c (大括號內將不賦值) 8. puts “$a $b $c” 10 22 8 (雙引號會取消大括號的影響) 9. expr $a+$b+c 40 ( TCL計算時須用expr指令) 10.set d expr $a+$b+$c 40 (將expr結果給d, 內代表另一指令的執行) 11.set e $a+$b+$c 10+22+8 (沒expr指令不會運算) Exec 112.set aa $d 40 (將d 的值設給aa) 13.set bb $d $d (”可保留特殊字元) 14.expr 10/3 3( T C L 自動判別為整數,因10,3皆整數) 15.expr

16、10.0/3 3.333333333333 (因10.0為float ) 16.set tcl_precision 8 8( 精確度設為8位, default 12) 17.expr 10.0/3 3.3333333 (前1後7, 不含小數點8位) 18.expr 1.0/3 0.33333333 (後8位, 整數為零不算) 19.set k 0; incr k 1( 等同於 set k expr $k+1 ) (note: incr後的變數不需加$) 20. incr k 4 5( 等同於 set k expr $k+4 ) Exec 1 cont.Exec 2 proc exec2 set

17、 x0 0 set y0 0 set x1 expr $x0+2 set y1 2 lakerCreateRect -layerName OD -point ($x0,$y0) ($x1,$y1) set x0 4 set y0 0 set x1 expr $x0+2 set y1 2 lakerCreateRect -layerName OD -point ($x0,$y0) ($x1,$y1) 請試著執行exec2的程式,並了解其運作的原理與結果: 步驟:1. 首先請開啟Layout window (Lib: exec,Cell:exec2) 2. 在Laker的main window中輸

18、入下面指令: (1) source exec2.tcl source tcl 程式 (2) exec2 執 行 procedureExec 2 Result 以空白區隔的一元素(字或值)我們稱之為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) 注意:所有的指 List 的 index 是從 0 開始。 關於 list 的相關指的使用方式如下: list 將其後的元素結成一個新的list % set a list a b c = a =

19、 a b c % list rick test = rick test % set mylist rick test = rick test TCL 基本資料型態:Listlist:將其後的元素連結成一個新的list Syntax:list arg1 arg2 (可使用中括弧、大括孤或雙引號) set a list a b c a = a b c set mylist rick test mylist = rick test lindex:根據指定的index傳回元素,所有的指令list 的index都是從 0 開始 Syntax:lindex list lindex lindex “a b

20、c d” 0 a 傳回list中第 0 個元素 lindex “a b c d” end d 傳回list中最後一個元素 lindex “a b c d” end-1 c 傳回list中倒數一個元素(倒數用法) lrange:傳回list中第n到第m個元素 Syntax:lrange list n m lrange “a b c d” 2 end c d 傳回第2個到最後一個間的元素 set list t p t s 1 t p t s 1 set y lrange $list 1 2 p t TCL 基本資料型態:List cont.lappend:附加另一list或字串到原來的list上

21、Syntax:lappend list1 list2 set CellList “INV” “INV” lappend CellList AND2 NOR2 “INV AND2 NOR2” lappend CellList “AND2 NOR2” “INV AND2 NOR2” linsert:插入另一個 list Syntax:linsert list index arg1 arg2 linsert “a d” 1 b c “a b c d” linsert “a d” 1 “b c” “a b c d” TCL 基本資料型態:List cont.TCL 基本資料型態:List cont.

22、lsort:排序list中的元素,傳回一新的list Syntax:lsort option list switch:-ascii、-integer、-real、-dictionary 以ASCII字元、整數、實數、字典順序排序 option:-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

23、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 lreplace:替換掉list中某一段的元素,傳回一新的list Syntax:lreplace list I j arg1 arg2 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 中的元素個數 Syntax:llength list llength a b c d 4 lsearch:搜尋list中的

24、元素,傳回其index,如果沒有找到符合的元素則傳回 -1 Syntax:lsearch list value mode : -exact 表示尋找完全相同的 -regexp 表示使用 regular expression 來尋找 set xyz a b c d e lsearch $xyz e 4 lsearch exact x y z z 2 TCL 基本資料型態:List cont.split:將一個連續的字串依指定的字元切開成為新的 list Syntax:split string splitChars set y /u/home/tcl/lists.tcl split $y / u

25、home tcl lists.tcl split abcdef “” a b c d e f join:與 split 相反,用來將list中所有的元素依指定的字元串接成一新的字串 Syntax:join list joinString set x 5 12 7 expr join $x + 24 ( expr 5+12+7 ) concat:將數個 list 中的元素展開後串起來成新的 list ( 展開一層 ) Syntax:contact list1 list2 concat a b c d e f g h i j k a b c d e f g h i j k TCL 基本資料型態:L

26、ist cont. 在表現比較複雜的資料結構時,list 並不是最好的選擇方案,在這些場合裏使用 TCL 的 array 型態會比 list 更加適合 TCL的陣列(array)的語法如下: set arr(index) value set arr(i,j) value 取得陣列元素的值一樣是使用 $ set content $arr(index) Index 可以是數值也可以是任意的字串 set arr(question1) “Answer1” set arr(question2) “Answer2” set abc(q1) “abc1” set abc(q2) “abc2” TCL 基本資

27、料型態:ArrayTCL 基本資料型態:Array cont. 定義array變數 set arr(0,0) 1 1 set arr(0,1) 2 2 set arr(1,0) 3 3 set arr(1,1) 4 4 判斷是否為array變數 array exists arr 1 將array中index對應到pattern的元素組成一個list傳回來 array get arr 0,0 1 0,1 2 1,0 3 1,1 4 將list轉換成array set list “a b c d” array set A $list echo $A(a) b echo $A(c) d 傳回arra

28、y的大小 array size arr 4字是TCL的基本資型態,常用處字的指有 string、append、format、scan 以及 binary。 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 比較字的內容 (-length:指定比較

29、字串長度 -nocase:表示不分大小寫) string compare nocase Rick rick 0 string compare length 3 rick ricp 0 TCL 基本資料型態: stringstring 指令注意事項 避免使用 = 來比較字串,因為 TCL 會試圖將字串轉換為數字再進行比較,於是16進位的0xa會等於十進位的10,因此建議儘量使用 string compare 或 string equal 來比較字串 if “0xa” = “10” puts “Correct” 建議改用string compare和string equal寫法 if string

30、 compare $s1 $s2 = 0 puts “Correct” if string equal $s1 $s2 puts “Correct” 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” TCL 的字串處理工具:stringTCL 的

31、字串處理工具:string 判斷字串的內容型態 string is integer $name 0 string is ascii $name 1 常用型態:ascii, integer, space, alnum, double ascii = “ABC” integer = “123” space = “ “ alnum = “ABC123” double = “123.456”在字串中尋找與pattern相符合的字串,若有找到則傳回 1,若否則傳回 0 語法:string match pattern string set str “ControlInformation“ string m

32、atch Control* $str 1 Pattern 的描述語法: * 表示零或零以上個任意字元 string match tcl* tcltk 1 string match tcl* rick 0 ? 表示任何一個單一任意字元 string match ric? rick 1 string match ri? rick 1 string match ric? rickpeng 0 TCL 的字串處理工具:string cont.TCL 的字串處理工具:string cont. :表示中括號中集合的一個任意字元 abc : 定義符合 abc 任意一個字元 a-z : 定義符合所有小寫英文字

33、母任意一個字元 例如a-e就表a,b,c,d,e 都包含在對應表中. string match a-z rick 0 string match a-za-za-za-z rick 1 ?:表示一個問號字元。對於那些保留字也一樣可以使用此一表示法例 如:*, ?, , 和 等字元 set a “a?bc”; string match a-ca-ca-ca-c $a 0 string match a-c?a-ca-c $a 1字串處理指令 format 將其後的字串中的%表示法依序替換為其所表示的數值格式並傳回新字串 format spec value1 value2 Example: set p

34、i expr 2*asin(1.0) 3.14159265359 puts format “Value: %s = %07.3f” “PI” $pi Value: PI = 003.142 %s 表示字串 %07.3f 表示浮點數數值表示格式為七位(小數點也算一位),小數點後到第三位,0表示不足的位數補上0。 TCL 的字串處理工具:format 字串處理指令 scan 依據指定的格式化條件剖析字串並將結果放入變數中 scan string pattern varName ?VarName .? scan會針對pattern所定義的格式去掃瞄變數string,並將相符合的字串依序傳給其後的變數

35、,此pattern表示法與前頁format指令相同。 範: set str “AreaUsagePattern = T3T57 ” ( 以空白鍵區分) scan $str “%s %s %s” key eq value Key AreaUsagePattern eq = Value T3T57 TCL 的字串處理工具:scan語法: if bool body1 else body2 bool:為 Boolean 表示式 如果bool為true則執行 body1 若為 false 則執行 body2 範:c2.tcl c2 set A 10 set B 5 if $A = $B puts “ A

36、 = B” else puts “ A = BTCL 基本流程控制:if - else cont. 請注意大括號的位置 Wrong If . Wrong If . else Correct If . Correct If . else TCL 基本流程控制:if - else cont. If else 巢狀語法 if elseif elseif else if if else else if else while 語法: while bool body bool為 Boolean 表示式 body是當bool為true時所欲執的指 範: # calculate the sum from 01

37、0 set a 0 set sum 0 while $a = 10 set sum expr $a+$sum set a expr $a + 1 puts “ Total = $sum “ TCL 基本流程控制: while while.tclTCL 基本流程控制: while Result 0 1 2 3 4 5 6 7 8 9 10 0 0 1 3 6 10 15 21 28 36 45 0 1 3 6 10 15 21 28 36 45 55 a sum new sumfor 語法: for init bool step body init是用設定for迴圈的初始設定值的部分 bool為

38、 Boolean 表示式 step是 body指執之後,下一次迴圈執前所做的動作 範 : # calculate the sum from 010 for set a 0; set sum 0 $a = 10 incr a set sum expr $sum + $a puts “ Total = $sum “ TCL 基本流程控制:f o r for.tclforeach 此指令會針對 List 中所有的元素執行動作 語法: foreach var List body List是個list var用替代自 List 中的元素以代入 body 中執,每個元素會執過一次。 適用於元素固定的情形

39、var可以只一個 TCL 基本流程控制:f o r e a c h範 : TCL 基本流程控制:f o r e a c h set sum 0 set numList list 1 2 3 4 5 6 7 8 9 10 foreach a $numList set sum expr $sum+ $a puts “Total = $sum” foreach.tclswitch 此指令會將string與其中所包含的pattern做比對,挑出其中一組相同的並執行其後的指令,若是都不相同則選 default 。 語法: switch ? options? string pattern body ? p

40、attern body .? options: -exact, -regexp, - - exact表示完全相同 - regexp 表示使用regular expression做比對 -代表switch指的flag設定已結束,接著的下一個字是要被比對的字(value)。使用-允許value是以-符號開頭的字。通常我們會在value字前加上這個flag。 注意:在switch寫註解只能寫在 body之中,否則TCL parse會掉! TCL 基本流程控制:s w i t c h範: proc aa value set b 0 switch -regexp - $value Laker set b

41、 caseA 0-9+ set b caseB (c|d) set b caseC default set b caseD return $b TCL 基本流程控制:s w i t c h tclaa Laker caseA tclaa 1 caseB tclaa c caseC tclaa abc caseD switch.tcl break 指可以用無條件停止並跳出迴圈。 continue 指則可以用終結目前這一的迴圈,直接跳到迴圈的下一繼續。 TCL 並沒有 goto指 error 指可以使執中的TCL程式終止,並發出錯誤訊息 TCL 基本流程控制:b r e a k c o n t i

42、 n u eTCL 可透過 sysSystem/exec指呼叫外部程式,並將外部程式執時傳到標準輸出(standard output)的結果傳回 exec 也支援輸出導向 “” 或管線(pipe) “|” 範: set date exec date set n exec sort /etc/passwd | uniq 但是,如果外部程式執的過程中有錯誤出現時傳回的是非的態碼,就會帶的導致 exec出錯,為避免這樣的情形,我們可用 catch擷取錯誤訊息 catch exec program arg1 arg2 result catch 之後要用大括號,因為catch本身會呼叫TCL的解譯器解譯

43、其後的指,如果用中括號則會在catch動作之前先解譯中括號中的指 執行外部程式:sysSystem/execTCL 基本流程控制: catch Catch 當TCL指發生錯誤時,如使用open開啟檔案失敗,TCL會中斷目前執的TCL Script。我們可以使用catch指補捉這些錯誤,catch指會執指定的指,如果指沒有發生錯誤,則catch指會將指的傳回值放入第二個,或是在指發生錯誤時將錯誤訊息放入第二個。如果沒有捕捉到任何錯誤,catch指本身的傳回值會是0,否則會傳回非0的值。 語法: catch command ?resultVar? 範: if catch open c:/autoe

44、xec.bat r fileid puts “opening file error: $fildid” else while gets $fileid line puts $line close $fileid 1. set traffic1 “red green yellow” /red green yellow 2. set traffic2 list red green yellow /red green yellow同1 3. set traffic3 “red green1 green2 yellow /red green1 green2 yellow 4. lindex $traf

45、fic1 0 /redlindex可取list值,list第一位為0,以此類推 5. lindex $traffic1 1 /green取list第2個值 6. lindex $traffic1 end /yellow取list最後一位 7. lindex $traffic3 1 /green1 green2 8. lappend traffic1 blue /red green yellow blue將blue加入traffic1 (note: 此時的traffic1不需加$) 9. lrange $traffic1 1 2 /green yellow取list中12的值 10. linse

46、rt $traffic1 2 “pink white” /red green pink white yellow blue (note: linsert並不會把結果放回traffic1,故traffic1仍為red green yellow blue) 11.lsort ascii decreasing $traffic1 /yellow red green blue 12.lsearch regexp $traffic1 .*ee.+ /1找到green且傳回位址1 13.set str happy; split $str “” /h a p p y 將字串逐字分開 14.set str “h a p p y”; join $str “” /happy 將字串合併 Exec 3

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报