TCL培訓(xùn)教程(全)

上傳人:簡****9 文檔編號:26539367 上傳時間:2021-08-11 格式:DOC 頁數(shù):95 大?。?33KB
收藏 版權(quán)申訴 舉報 下載
TCL培訓(xùn)教程(全)_第1頁
第1頁 / 共95頁
TCL培訓(xùn)教程(全)_第2頁
第2頁 / 共95頁
TCL培訓(xùn)教程(全)_第3頁
第3頁 / 共95頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《TCL培訓(xùn)教程(全)》由會員分享,可在線閱讀,更多相關(guān)《TCL培訓(xùn)教程(全)(95頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 Tcl編程簡介(一)   簡介   Tcl是一種很通用的腳本語言,它幾乎在所有的平臺上都可以解釋運行,功能強大。是tool command language的縮寫,發(fā)音為 "tickle”, 實際上包含了兩個部分:一個語言和一個庫。   首先,Tcl是一種簡單的腳本語言,主要使用于發(fā)布命令給一 些互交程序如文本編輯器、調(diào)試器和shell。它有一個簡單的語法 和很強可擴充性,Tcl可以創(chuàng)建新的過程以增強其內(nèi)建命令的能力。   其次,Tcl是一個庫包,可以被嵌入應(yīng)用程序,Tcl的庫包含了一個分析器、用于執(zhí)行內(nèi)建命令的例程和可以使你擴充(定義新的 過程)的庫函數(shù)。

2、應(yīng)用程序可以產(chǎn)生Tcl命令并執(zhí)行,命令可以由用戶產(chǎn)生,也可以從用戶接口的一個輸入中讀?。ò粹o或菜單等)。 但Tcl庫收到命令后將它分解并執(zhí)行內(nèi)建的命令,經(jīng)常會產(chǎn)生遞歸的調(diào)用。   下面簡單介紹以下tcl的語法規(guī)則: 解釋器   在Tcl的數(shù)據(jù)結(jié)構(gòu)中的核心是Tcl_Interp.一個解釋器包含了一套命令,一組變量和一些用于描述狀態(tài)的東西。每一個 Tcl命令是 在特定的Tcl_Interp中運行的,基于Tcl的應(yīng)用程序可以同時擁有幾個Tcl_Interp。Tcl_Interp是一個輕量級的結(jié)構(gòu),可以快速的新建和刪除。 數(shù)據(jù)類型   Tcl只支持一種數(shù)據(jù)結(jié)構(gòu):字符串(string)。所有的

3、命令,命令的所有的參數(shù),命令的結(jié)果,所有的變量都是字符串。請牢記這一點,所有的東西都是字符串。 這是它比較有特點的方面字符串有三種形式:命令(command), 表達(dá)式(expresion)和表(list)。 Basic Command Syntax 基本語法   Tcl有類似于shell和lisp的語法,當(dāng)然也有許多的不同。一 條Tcl的命令串包含了一條或多條命令用換行符或分號來隔開,而每一條命令包含了一個域(field)的集合,域使用空白分開的,第一個域是一個命令的名字,其它的是作為參數(shù)來傳給它。   例如:   set a 22 //相當(dāng)于C中的 a=22 a是一個變量這條命令分

4、為三個域:1 set 2 a 3 22 set使用于設(shè)置變量的值的命令,a、20 作為參數(shù)來傳給它,a使它要操作的變量名,22是要付給的a值。   Tcl的命令名可以是內(nèi)置的命令也可以是用戶建的新命令,如果是用戶用戶建的新命令應(yīng)用程序中用函數(shù)Tcl_CreateCommand來創(chuàng)建。所有的參數(shù)作為字符串來傳遞,命令自己會按其所需來解釋的參數(shù)的。命令的名字必須被打全,但 Tcl解釋器找不到一同名的命令時會用 unknown命令來代替。   在很多場合下,unknown 會在庫目錄中搜尋,找到一個的話,會自動生成一個Tcl命令并調(diào)用它。unknown經(jīng)常完成縮略的命令名的執(zhí)行。但最好不要使

5、用。 注釋   和shell很象,第一個字母是"#"的Tcl字符串是注釋。 其他細(xì)節(jié)規(guī)則   Grouping arguments with double-quotes 用雙引號來集群參數(shù),目的在于使用有空白的參數(shù)。   例如: set a "this string contains whitespace"   如夠一個參數(shù)一雙引號來開始,該參數(shù)會一直到下一個雙引號才結(jié)束。其中可以有換行符和分號。   Variable substitution with $ 用美元符進行變量替換說白了就是引用該變量。   如: set a hello set b $a // b

6、= "hello" 實際上傳給set命令的參數(shù) //是b,"hello" set c a // b = "a"   Command substitution with brackets 命令子替換(用方括號)   例如: set a [set b "hello"]   實現(xiàn)執(zhí)行 set b "hello" 并用其結(jié)果來替換源命令 中的方括號部分,產(chǎn)生一條新命令   set a "hello" //"hello" 為 set b "hello" 的返回值   最終的結(jié)果是b="hello" a="hello"   當(dāng)命令的一個子域以方括號開始以方括號結(jié)束,表示要進行一個

7、命令子替換。并執(zhí)行該子命令,用其結(jié)果來替換原命令中的方括號部分。方括號中的部分都被視為Tcl命令。   如下一個復(fù)雜一點的例子: set a xyz[set b "abc"].[set c "def"] //return xyzabcdef   Backslash substitution 轉(zhuǎn)移符替換   轉(zhuǎn)移符時間不可打印字符或由它數(shù)意義的字符插入進來。這一概念與C語言中的一樣。 Backspace (0x8). f Form feed (0xc). Newline (0xa). Carriage-return (0xd). Tab (

8、0x9). v Vertical tab (0xb). { Left brace (`{"). } Right brace (`}"). [ Open bracket (`["). ] Close bracket (`]"). $ Dollar sign (`$"). sp Space (` "): does not terminate argument. ; Semicolon: does not terminate command. " Double-quote.   Grouping arguments with braces 用花擴括號來集群參數(shù)

9、   用花擴括號來集群參數(shù)與用雙引號來集群參數(shù)的區(qū)別在于:用花擴括號來集群參數(shù)其中的三種上述的子替換不被執(zhí)行。而且可以嵌套。   例如: set a {xyz a {b c d}}//set收到倆個參數(shù) a "xyz a {b c d}" eval { set a 22 set b 33 }//eval收到一個參數(shù) "set a 22 set b 33" 命令綜述   1.一個命令就是一個字符串(string)。   2.命令是用換行符或分號來分隔的。   3.一個命令由許多的域組成。第一個于是命令名,其它的域作為參數(shù)來傳遞。   4.域通常是有空白(T

10、ab橫向制表健 Space空格)來分開的。   5.雙引號可以使一個參數(shù)包括換行符或分號。三種子替換仍然發(fā)生。   6.花括號類似于雙引號,只是不進行三總體換。   7.系統(tǒng)只進行一層子替換,機制替換的結(jié)果不會再去做子替換。而且子替換可以在任何一個域進行。   8.如果第一個非控字符是`#", 這一行的所有東西都是注釋。 表達(dá)式   對字符串的一種解釋是表達(dá)式。幾個命令將其參數(shù)按表達(dá)式處理,如:expr、for 和 if,并調(diào)用Tcl表達(dá)式處理器(Tcl_ExprLong, Tcl_ExprBoolean等)來處理它們。其中的運算符與C語言的很相似。   邏輯非 * / %

11、 + - << >>   左移 右移 只能用于整數(shù)。 < > <= >= == !=   邏輯比較 & ^ |   位運算 和 異或 或 &&   邏輯"和" "或" x ? y : z   If-then-else 與C的一樣   Tcl 中的邏輯真為1,邏輯假為0。   一些例子: 5 / 4.0 5 / ( [string length "abcd"] + 0.0 )   計算字符串的長度 轉(zhuǎn)化為浮點數(shù)來計算 "0x03" > "2" "0y" < "0x12"   都返回 1 set a 1 expr $a+2

12、 expr 1+2   都返回 3 窗體底端 窗體頂端 TCL語言   Tcl (最早稱為“工具命令語言”"Tool Command Language", 但是目前已經(jīng)不是這個含義,不過我們?nèi)匀环Q呼它為TCL)是一種 腳本語言。 由John Ousterhout創(chuàng)建。 TCL很好學(xué),功能很強大。TCL經(jīng)常被用于 快速原型開發(fā),腳本編程, GUI和測試等方面。TCL念作“踢叩” "tickle". Tcl的特性包括:   * 任何東西都是一條命令,包括語法結(jié)構(gòu)(for, if等)。   * 任何事物都可以重新定義和重載。   

13、* 所有的數(shù)據(jù)類型都可以看作字符串。   * 語法規(guī)則相當(dāng)簡單   * 提供事件驅(qū)動給Socket和文件。基于時間或者用戶定義的事件也可以。   * 動態(tài)的域定義。   * 很容易用C, C++,或者Java擴展。   * 解釋語言,代碼能夠動態(tài)的改變。   * 完全的Unicode支持。   * 平臺無關(guān)。Win32, UNIX, Mac 上都可以跑。   * 和Windows的GUI緊密集成。 Tk   * 代碼緊湊,易于維護。   TCL本身不提供面向?qū)ο蟮闹С?。但是語言本身很容易擴展到支持面向?qū)ο蟆TS多C語言擴展都提供面向?qū)ο竽芰?,包括XOTcl, Incr Tcl

14、 等。另外SNIT擴展本身就是用TCL寫的。   使用最廣泛的TCL擴展是TK。 TK提供了各種OS平臺下的圖形用戶界面GUI。連強大的Python語言都不單獨提供自己的GUI,而是提供接口適配到TK上。另一個流行的擴展包是Expect. Expect提供了通過終端自動執(zhí)行命令的能力,例如(passwd, ftp, telnet等命令驅(qū)動的外殼).   下面是TCL程序的例子:   #!/bin/sh   # next line restarts using tclsh in path \   exec tclsh ${1+"$@"}   # echo server that ca

15、n handle multiple   # simultaneous connections.   proc newConnection { sock addr port } {   # client connections will be handled in   # line-buffered, non-blocking mode   fconfigure $sock -blocking no -buffering line   # call handleData when socket is readable   fileevent $sock readable [ li

16、st handleData $sock ]   }   proc handleData {   puts $sock [ gets $sock ]   if { [ eof $sock ] } {   close $sock   }   }   # handle all connections to port given   # as argument when server was invoked   # by calling newConnection   set port [ lindex $argv 0 ]   socket -server newConnect

17、ion $port   # enter the event loop by waiting   # on a dummy variable that is otherwise   # unused.   vwait forever   另外一個TK的例子 (來自 A simple A/D clock) 它使用了定時器時間,3行就顯示了一個時鐘。   proc every {ms body} {eval $body; after $ms [info level 0]}   pack [label .clock -textvar time]   every 1000 {set ::

18、time [clock format [clock sec] -format %H:%M:%S]} ;# RS   解釋:第一行定義了過程every, 每隔ms毫秒,就重新執(zhí)行body代碼。第二行創(chuàng)建了標(biāo)簽起內(nèi)容由time變量決定。第3行中設(shè)置定時器,time變量從當(dāng)前時間中每秒更新一次。   Tcl被廣泛的用做script語言,大多數(shù)情況下,Tcl和Tk(“Tool Kit”)庫同時使用,Tk是一系列令Tcl易于編寫圖形用戶接口的命令和過程   Tcl的一個重要特性是它的擴展性。如果一個程序需要使用某些標(biāo)準(zhǔn)Tcl沒有提供的功能,可以使用c語言創(chuàng)造一些新的Tcl命令,并很容易的融合進去

19、。正是由于Tcl易于擴展,很多人為它編寫了擴展包,并在網(wǎng)上共享。   Tcl和其他編程語言例如c不同,它是一種解釋語言而非編譯語言。Tcl程序由一系列Tcl命令組成,在運行時由Tcl解釋器解釋運行。解釋運行的一個優(yōu)點是它可以自己為自己生成Tcl script。   變量和變量交換   不像c,Tcl的變量在使用前不需要聲明。Tcl的變量在它首次被賦值時產(chǎn)生,使用set命令。變量可以用unset命令刪除,雖然并不強制需要這樣做。   變量的值通過$符號訪問,也叫變量交換。   Tcl是一個典型的”弱類型定義”語言,這意味者任何類型可以存儲在任何變量中。例如,同一個變量可以存儲數(shù)字,日期

20、,字符串甚至另一段Tcl script.   Example 1.1:   set foo "john"   puts "Hi my name is $foo"   Output: Hi my name is john   Example 1.2:   set month 2   set day 3   set year 97   set date "$month:$day:$year"   puts $date   Output: 2:3:97   Example 1.3:   set foo "puts hi"   eval $foo   Outpu

21、t: hi   在這個例子里,變量foo存儲了另外一段Tcl script.   表達(dá)式   包括數(shù)學(xué)表達(dá)式,關(guān)系表達(dá)式,通常用 expr命令。   Example 2.1:   expr 0 == 1   Output: 0   Example 2.2:   expr 1 == 1   Output: 1   兩數(shù)比較,true則輸出1,false輸出0   Example 2.3:   expr 4 + 5   Output: 9   Example 2.4:   expr sin(2)   Output: 0.909297   命令傳遞   以運算結(jié)果

22、替代Tcl命令中的部分   Example 3.1:   puts "I am [expr 10 * 2] years old, and my I.Q. is [expr 100 - 25]"   Output: I am 20 years old, and my I.Q. is 75   方括號是命令傳遞的標(biāo)志   Example 3.2:   set my_height 6.0   puts "If I was 2 inches taller, I would be [expr $my_height + (2.0 / 12.0)] feet tall"   Output:

23、 If I was 2 inches taller, I would be 6.16667 feet tall   命令流控制   Tcl有判斷流轉(zhuǎn)(if-else; switch)和循環(huán)控制(while; for; foreach)   Example 4.1:   set my_planet "earth"   if {$my_planet == "earth"} {   puts "I feel right at home."   } elseif {$my_planet == "venus"} {   puts "This is not my home."   }

24、else {   puts "I am neither from Earth, nor from Venus."   }   set temp 95   if {$temp < 80} {   puts "Its a little chilly."   } else {   puts "Warm enough for me."   }   Output:   I feel right at home.   Warm enough for me.   Example 4.2:   set num_legs 4   switch $num_legs {   2

25、{puts "It could be a human."}   4 {puts "It could be a cow."}   6 {puts "It could be an ant."}   8 {puts "It could be a spider."}   default {puts "It could be anything."}   }   Output:   It could be a cow.   Example 4.3:   for {set i 0} {$i < 10} {incr i 1} {   puts "In the for loop, and

26、 i == $i"   }   Output:   In the for loop, and i == 0   In the for loop, and i == 1   In the for loop, and i == 2   In the for loop, and i == 3   In the for loop, and i == 4   In the for loop, and i == 5   In the for loop, and i == 6   In the for loop, and i == 7   In the for loop, and i

27、 == 8   In the for loop, and i == 9   Example 4.4:   set i 0   while {$i < 10} {   puts "In the while loop, and i == $i"   incr i 1   }   Output:   In the while loop, and i == 0   In the while loop, and i == 1   In the while loop, and i == 2   In the while loop, and i == 3   In the whi

28、le loop, and i == 4   In the while loop, and i == 5   In the while loop, and i == 6   In the while loop, and i == 7   In the while loop, and i == 8   In the while loop, and i == 9   Example 4.5:   foreach vowel {a e i o u} {   puts "$vowel is a vowel"   }   Output:   a is a vowel   e is

29、 a vowel   i is a vowel   o is a vowel   u is a vowel   Procedures   Tcl的Procedures 和c的函數(shù)差不多. 它們有參數(shù),它們返回值。基本定義方法是:   proc name argList body   當(dāng)一個procedure被定義,它就被看做是一個命令,如同Tcl的自帶命令一樣,通過名字來呼叫,名字后面跟上參數(shù)。   缺省的,procedure的返回值是它的最后一個命令結(jié)果。但也可以通過return命令來返回其他值。Return值可以在procedure的任何地方,一旦執(zhí)行,procedure就

30、此返回。   Example 5.1:   proc sum_proc {a b} {   return [expr $a + $b]   }   proc magnitude {   if {$num > 0} {   return $num   }   set num [expr $num * (-1)]   return $num   }   set num1 12   set num2 14   set sum [sum_proc $num1 $num2]   puts "The sum is $sum"   puts "The magnitud

31、e of 3 is [magnitude 3]"   puts "The magnitude of -2 is [magnitude -2]"   Output:   The sum is 26   The magnitude of 3 is 3   The magnitude of -2 is 2   在procedure中可以通過set創(chuàng)造變量,但是變量只在procedure中有效,而且一旦procedure返回,這些變量就不可訪問。如果procedure需要訪問主程序中的變量,就需要使用global關(guān)鍵字。   Example 5.2:   proc dumb_pro

32、c {} {   set myvar 4   puts "The value of the local variable is $myvar"   global myglobalvar   puts "The value of the global variable is $myglobalvar"   }   set myglobalvar 79   dumb_proc   Output:   The value of the local variable is 4   The value of the global variable is 79    List

33、s   Lists就好像是Tcl中的一種特殊的數(shù)組。它把一堆東西放成一個集合,然后就像操作一個整體一樣的操作它。   Example 6.1:   set simple_list "John Joe Mary Susan"   puts [lindex $simple_list 0]   puts [lindex $simple_list 2]   Output:   John   Mary   注意list的index是從0開始的   Example 6.2:   set simple_list2 "Mike Sam Heather Jennifer"   set

34、compound_list [list $simple_list $simple_list2]   puts $compound_list   puts [llength $compound_list]   Output:   {John Joe Mary Susan} {Mike Sam Heather Jennifer}   2   Example 6.3:   set mylist "Mercury Venus Mars"   puts $mylist   set mylist [linsert $mylist 2 Earth]   puts $mylist   

35、lappend mylist Jupiter   puts $mylist   Output:   Mercury Venus Mars   Mercury Venus Earth Mars   Mercury Venus Earth Mars Jupiter   Arrays   Tcl數(shù)組在使用前無須定義,大小也不用指定。   Example 7.1:   set myarray(0) "Zero"   set myarray(1) "One"   set myarray(2) "Two"   for {set i 0} {$i < 3} {incr i 1}

36、 {   puts $myarray($i)   }   Output:   Zero   One   Two   Example 7.2:   set person_info(name) "Fred Smith"   set person_info(age) "25"   set person_info(occupation) "Plumber"   foreach thing {name age occupation} {   puts "$thing == $person_info($thing)"   }   Output:   name ==

37、Fred Smith   age == 25   occupation == Plumber   這個例子指出數(shù)組的index不需要是數(shù)字,其他類型的數(shù)據(jù)也可以。   Example 7.3:   set person_info(name) "Fred Smith"   set person_info(age) "25"   set person_info(occupation) "Plumber"   foreach thing [array names person_info] {   puts "$thing == $person_info($thing)"   }

38、   Output:   occupation == Plumber   age == 25   name == Fred Smith   Strings   字符串是Tcl中最常用的類型,string有很多使用參數(shù),可以參照Tcl手冊。使用方法:   string option arg arg ...   Example 8.1:   set str "This is a string"   puts "The string is: $str"   puts "The length of the string is: [string length $str]"

39、   puts "The character at index 3 is: [string index $str 3]"   puts "The characters from index 4 through 8 are: [string range $str 4 8]"   puts "The index of the first occurrence of letter \"i\" is: [string first i $str]"   Output:   The string is: This is a string   The length of the string is

40、: 16   The character at index 3 is: s   The characters from index 4 through 8 are: is a   The index of the first occurrence of letter "i" is: 2   Input/Output   Tcl的絕大多數(shù)輸入/輸出是通過puts和gets做到的。Puts命令顯示在console上,gets命令從console輸入上取得數(shù)據(jù),并存儲在某個變量中。   gets channelId varName   channelID可以理解為c的文件句柄,varN

41、ame如果定義,輸入值就賦給它,gets返回讀入的字節(jié)數(shù),否則gets直接返回輸入值。   Example 9.1:   puts -nonewline "Enter your name: "   set bytesread [gets stdin name]   puts "Your name is $name, and it is $bytesread bytes long"   Output: (note that user input is shown in italics)   Enter your name: Shyam   Your name is Shyam,

42、 and it is 5 bytes long   Example 9.2:   set f [open "/tmp/myfile" "w"]   puts $f "We live in Texas. Its already 110 degrees out here."   puts $f "456"   close $f   Output: (none)   Open打開了一個 "/tmp/myfile" 作為channel. 用法是:   open name access   access參數(shù)指出打開文件的方式,”w”是讀寫。這時可以用puts $f把內(nèi)容寫入文件

43、   Example 9.3:   set f [open "/tmp/myfile" "r"]   set line1 [gets $f]   set len_line2 [gets $f line2]   close $f   puts "line 1: $line1"   puts "line 2: $line2"   puts "Length of line 2: $len_line2"   Output:   line 1: We live in Texas. Its already 110 degrees out here.   line 2: 456

44、   Length of line 2: 3   這個例子假設(shè)已知文件只有兩行,如果不是,則需要使用循環(huán),用eof來找到文件尾。   eval   eval命令會把它的參數(shù)直接送往解釋器。   Example 10.1:   set foo "set a 22"   eval $foo   puts $a   Output:   22   單純的執(zhí)行$foo不會成功。   catch   Example 10.2:   set retval [catch {set f [open "nosuchfile" "r"]}]   if {$retval == 1} {

45、   puts "An error occured"   }   Output: (this output occurs if there is no file named "nosuchfile" in the current directory).   An error occured   Catch 參數(shù)記錄一個script的執(zhí)行情況,如果返回值為1,則執(zhí)行出錯。用來進行錯誤處理。 修訂記錄用于說明對文檔加附頁或文檔版本升級時對文檔的改動情況,一般設(shè)計類文檔 1引言 6 2語法 7 2.1腳本、命令和單詞符號 7 2.2置換(substit

46、ution) 7 2.2.1變量置換(variable subtitution) 8 2.2.2命令置換(command substitution) 8 2.2.3反斜杠置換(backslash substitution) 8 2.2.4雙引號和花括號 9 2.3注釋 9 3變量 10 3.1簡單變量 10 3.2數(shù)組 11 3.3相關(guān)命令 11 3.3.1set 11 3.3.2unset 11 3.3.3append和incr 12 4表達(dá)式 12 4.1操作數(shù) 12 4.2運算符和優(yōu)先級 12 4.3數(shù)學(xué)函數(shù) 13

47、 5List 14 5.1list命令 14 5.2concat命令: 14 5.3lindex命令 15 5.4llength命令 15 5.5linsert命令 15 5.6lreplace命令: 15 5.7lrange 命令: 15 5.8lappend命令: 15 5.9lsearch 命令: 16 5.10lsort命令: 16 5.11split命令: 16 5.12join命令 17 6控制流 17 6.1if命令 17 6.2循環(huán)命令:while 、for、 foreach 17 6.2.1while命令 17

48、 6.2.2for命令 18 6.2.3foreach命令 18 6.2.4break和continue命令 19 6.2.5switch 命令 19 6.1eval命令 19 6.2source命令 19 7過程(procedure) 20 7.1過程定義和返回值 20 7.2局部變量和全局變量 20 7.3缺省參數(shù)和可變個數(shù)參數(shù) 21 7.4引用:upvar 21 8字符串操作 22 8.1format命令 22 8.2scan命令 23 8.3regexp命令 23 8.4regsub命令 25 8.5string命令

49、25 8.5.1string compare ?-nocase? ?-length int? string1 string2 25 8.5.2string equal ?-nocase? ?-length int? string1 string2 25 8.5.3string first string1 string2 ?startindex? 26 8.5.4string index string charIndex 26 8.5.5string last string1 string2 ?startindex? 26 8.5.6strin

50、g length string 26 8.5.7string match ?-nocase? pattern string 26 8.5.8string range string first last 27 8.5.9string repeat string count 27 8.5.10string replace string first last ?newstring? 27 8.5.11string tolower string ?first? ?last? 27 8.5.12strin

51、g toupper string ?first? ?last? 27 8.5.13 string trim string ?chars? 27 8.5.14string trimleft string ?chars? 27 8.5.15string trimright string ?chars? 27 9文件訪問 28 9.1文件名 28 9.2基本文件輸入輸出命令 28 9.3隨機文件訪問 29 30 9.5文件操作和獲取文件信息 30 10錯誤和異常 33 10.1錯誤 33 10.2從TCL腳

52、本中產(chǎn)生錯誤 34 10.3使用catch捕獲錯誤 35 10.4其他異常 35 11深入TCL 37 11.1查詢數(shù)組中的元素 37 11.2 info命令 38 11.2.1變量信息 38 11.2.2過程信息 39 11.2.3命令信息 40 11.2.4 TCL的版本和庫 41 11.2.5 命令的執(zhí)行時間 41 11.2.6 跟蹤變量 41 11.2.7 命令的重命名和刪除 43 11.2.8 unknown命令 44 11.2.9自動加載 44 12歷史記錄 45 13TCL和C\C++ 47 13.1生成自

53、己的TCLSH 48 13.2擴展自己的命令:方法(一) 48 13.2.1編寫擴展命令對應(yīng)的C/C++過程 48 13.2.2注冊命令 49 13.2.3命令返回值和命令對應(yīng)的過程的返回值 50 13.3擴展自己的命令:方法(二) 52 13.3.1Tcl_Obj結(jié)構(gòu) 52 13.3.2編寫擴展命令對應(yīng)的C/C++過程 54 13.3.3注冊命令 54 13.4利用clientData參數(shù)和deleteProc參數(shù) 55 13.5在C/C++應(yīng)用程序中嵌入TCL 58 14總結(jié) 59 引言 TCL(Tool Command Langua

54、ge)是一種解釋執(zhí)行的腳本語言(Scripting Language)。 它提供了通用的編程能力:支持變量、過程和控制結(jié)構(gòu);同時TCL還擁有一個功能強大的固有的核心命令集。 由于TCL的解釋器是用一個C\C++語言的過程庫實現(xiàn)的,因此在某種意義上我們又可以把TCL看作一個C庫,這個庫中有豐富的用于擴展TCL命令的C\C++過程和函數(shù),可以很容易就在C\C++應(yīng)用程序中嵌入TCL,而且每個應(yīng)用程序都可以根據(jù)自己的需要對TCL語言進行擴展。我們可以針對某一特定應(yīng)用領(lǐng)域?qū)CL語言的核心命令集進行擴展,加入適合于自己的應(yīng)用領(lǐng)域的擴展命令,如果需要,甚至可以加入新的控制結(jié)構(gòu),TCL解釋器將把擴展命令

55、和擴展控制結(jié)構(gòu)與固有命令和固有控制結(jié)構(gòu)同等看待。擴展后的TCL語言將可以繼承TCL 核心部分的所有功能,包括核心命令、控制結(jié)構(gòu)、數(shù)據(jù)類型、對過程的支持等。根據(jù)需要,我們甚至可以屏蔽掉TCL的某些固有命令和固有控制結(jié)構(gòu)。通過對TCL的擴展、繼承或屏蔽,用戶用不著象平時定義一種計算機語言那樣對詞法、語法、語義、語用等各方面加以定義,就可以方便的為自己的應(yīng)用領(lǐng)域提供一種功能完備的腳本語言。 TCL良好的可擴展性使得它能很好地適應(yīng)產(chǎn)品測試的需要,測試任務(wù)常常會由于設(shè)計和需求的改變而迅速改變,往往讓測試人員疲于應(yīng)付。利用TCL的可擴展性,測試人員就可以迅速繼承多種新技術(shù),并針對產(chǎn)品新特點迅速推出擴展T

56、CL命令集,以用于產(chǎn)品的測試中,可以較容易跟上設(shè)計需求的變化。 另外,因為TCL是一種比C\C++ 語言有著更高抽象層次的語言,使用TCL可以在一種更高的層次上編寫程序,它屏蔽掉了編寫C\C++程序時必須涉及到的一些較為煩瑣的細(xì)節(jié),可以大大地提高開發(fā)測試?yán)乃俣?。而且?使用TCL語言寫的測試?yán)_本,即使作了修改,也用不著重新編譯就可以調(diào)用TCL解釋器直接執(zhí)行??梢允s不少時間。 TCL 目前已成為自動測試中事實上的標(biāo)準(zhǔn)。 1 語法 簡單的講,TCL語言的語法實際上是一些TCL解釋器怎樣對TCL命令進行分析的規(guī)則的集合。 1.1 腳本、命令和單詞符號 一個TCL腳本可以包含一個

57、或多個命令。命令之間必須用換行符或分號隔開,下面的兩個腳本都是合法的: set a 1 set b 2 或 set a 1;set b 2 TCL的每一個命令包含一個或幾個單詞,第一個單詞代表命令名,另外的單詞則是這個命令的參數(shù),單詞之間必須用空格或TAB鍵隔開。 TCL解釋器對一個命令的求值過程分為兩部分:分析和執(zhí)行。在分析階段,TCL 解釋器運用規(guī)則把命令分成一個個獨立的單詞,同時進行必要的置換(substitution); 在執(zhí)行階段,TCL 解釋器會把第一個單詞當(dāng)作命令名,并查看這個命令是否有定義,如果有定義就激活這個命令對應(yīng)的C/C++過程,并把所有的單詞作為參數(shù)傳遞給

58、該命令過程,讓命令過程進行處理。 1.2 置換(substitution) 注:在下面的所有章節(jié)的例子中,%為TCL的命令提示符,輸入命令回車后,TCL會在接著的一行輸出命令執(zhí)行結(jié)果。//后面是我自己加上的說明,不是例子的一部分。 TCL解釋器在分析命令時,把所有的命令參數(shù)都當(dāng)作字符串看待,例如: %set x 10 //定義變量x,并把x的值賦為10 10 %set y x+100 //y的值是x+100,而不是我們期望的110 x+100 上例的第二個命令中,x被看作字符串x+100的一部分,如果我們想使用x的值10 ,就必須告訴TCL解釋器:

59、我們在這里期望的是變量x的值,而非字符x。怎么告訴TCL解釋器呢,這就要用到TCL語言中提供的置換功能。 TCL提供三種形式的置換:變量置換、命令置換和反斜杠置換。每種置換都會導(dǎo)致一個或多個單詞本身被其他的值所代替。置換可以發(fā)生在包括命令名在內(nèi)的每一個單詞中,而且置換可以嵌套。 1.2.1 變量置換(variable subtitution) 變量置換由一個$符號標(biāo)記,變量置換會導(dǎo)致變量的值插入一個單詞中。例如: %set y $x+100 //y的值是10+100,這里x被置換成它的值10 10+100 這時,y的值還不是我們想要的值110,而是10+100,因為TCL解

60、釋器把10+100看成是一個字符串而不是表達(dá)式,y要想得到值110,還必須用命令置換,使得TCL會把10+100看成一個表達(dá)式并求值。 1.2.2 命令置換(command substitution) 命令置換是由[]括起來的TCL命令及其參數(shù),命令置換會導(dǎo)致某一個命令的所有或部分單詞被另一個命令的結(jié)果所代替。例如: %set y [expr $x+100] 110 y的值是110,這里當(dāng)TCL解釋器遇到字符[時,它就會把隨后的expr作為一個命令名,從而激活與expr對應(yīng)的C/C++過程,并把expr和變量置換后得到的10+110傳遞給該命令過程進行處理。 如果在上例中我們

61、去掉[],那么TCL會報錯。因為在正常情況下,TCL解釋器只把命令行中的第一個單詞作為看作命令,其他的單詞都作為普通字符串處理,看作是命令的參數(shù)。 注意,[]中必須是一個合法的TCL腳本,長度不限。[]中腳本的值為最后一個命令的返回值,例如: %set y [expr $x+100;set b 300] //y的值為300,因為set b 300的返回值為300 300 有了命令置換,實際上就表示命令之間是可以嵌套的,即一個命令的結(jié)果可以作為別的命令的參數(shù)。 1.2.3 反斜杠置換(backslash substitution) TCL語言中的反斜杠置換類似于C語言中

62、反斜杠的用法,主要用于在單詞符號中插入諸如換行符、空格、[、$等被TCL解釋器當(dāng)作特殊符號對待的字符。例如: set msg multiple\ space //msg的值為multiple space。 如果沒有\(zhòng)的話,TCL會報錯,因為解釋器會把這里最后兩個單詞之間的空格認(rèn)為是分隔符,于是發(fā)現(xiàn)set命令有多于兩個參數(shù),從而報錯。加入了\后,空格不被當(dāng)作分隔符,multiple space被認(rèn)為是一個單詞(word)。又例如: %set msg money\ \$3333\ \nArray\ a\[2] //這個命令

63、的執(zhí)行結(jié)果為:money $3333 Array a[2] 這里的$不再被當(dāng)作變量置換符。 TCL支持以下的反斜杠置換: Backslash Sequence Replaced By \a Audible alert (0x7) \b Backspace (0x8) \f Form feed (0xc) \n Newline (0xa) \r Carriage return (0xd) \t T

64、ab (0x9) \v Vertical tab (0xb) \ddd Octal value given by ddd (one, two, or three ds) \xhh Hex value given by hh (any number of hs) \ newline space A single space character. 例如: %set a \x48 //對應(yīng) \xhh H //十六進制的48正

65、好是72,對應(yīng)H % set a \110 //對應(yīng) \ddd H //八進制的110正好是72,對應(yīng)H %set a [expr \ // 對應(yīng)\newline space,一個命令可以用\newline轉(zhuǎn)到下一行繼續(xù) 2+3] 5 1.2.4 雙引號和花括號 除了使用反斜杠外,TCL提供另外兩種方法來使得解釋器把分隔符和置換符等特殊字符當(dāng)作普通字符,而不作特殊處理,這就要使用雙引號和花括號({})。 TCL解釋器對雙引號中的各種分隔符將不作處理,但是

66、對換行符 及$和[]兩種置換符會照常處理。例如: %set x 100 100 %set y "$x ddd" 100 ddd 而在花括號中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會對其作特殊處理。 %set y {/n$x [expr 10+100]} /n$x [expr 10+100] 1.3 注釋 TCL中的注釋符是#,#和直到所在行結(jié)尾的所有字符都被TCL看作注釋,TCL解釋器對注釋將不作任何處理。不過,要注意的是,#必須出現(xiàn)在TCL解釋器期望命令的第一個字符出現(xiàn)的地方,才被當(dāng)作注釋。 例如: %#This is a comment %set a 100 # Not a comment wrong # args: should be "set varName ?newValue?" %set b 101 ; # this is a comment 101 第二行中#就不被當(dāng)作注釋符,因

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔

相關(guān)搜索

關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!