Tcl語言基礎教程_第1頁
Tcl語言基礎教程_第2頁
Tcl語言基礎教程_第3頁
Tcl語言基礎教程_第4頁
Tcl語言基礎教程_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Tcl語言參考Tcl("Tool Command Language",即工具命令語言;Tcl念作“踢叩” "tickle" )是一種易學易用易于擴展的腳本語言,實際上包含了兩個部分:一個語言和一個庫。首先,Tcl是一種簡單的腳本語言,主要使用于發布命令給一些交互程序如文本編輯器、調試器和shell。它有一個簡單的語法和很強可擴充性,Tcl可以創建新的過程以增強其內建命令的能力。其次,Tcl是一個庫包,可以被嵌入應用程序,Tcl的庫包含了一個分析器、用于執行內建命令的例程和可以使你擴充(定義新的過程)的庫函數。應用程序可以產生Tcl命令并執行,命令可以由用

2、戶產生,也可以從用戶接口的一個輸入中讀取(按鈕或菜單等)。Tcl和其他編程語言例如C不同,它是一種解釋語言而非編譯語言。Tcl程序由一系列Tcl命令組成,在運行時由Tcl解釋器解釋運行。Tcl有大量的用C/C+編寫的擴展用于提供Tcl本身不具有的功能。其中使用最廣泛的擴展是TK,TK提供了各種OS平臺下的圖形用戶界面GUI(連強大的Python語言都不單獨提供自己的GUI,而是提供接口適配到TK上)。另一個流行的擴展包是Exp-ect,它提供了通過終端自動執行命令的能力,例如passwd, ftp, telnet等命令驅動的外殼。一、Tcl程序基本結構1、基本語法Tcl有類似于shell的語法

3、,一條Tcl的命令串包含了一條或多條命令用換行符或分號來隔開,而每一條命令包含了一個域(field)的集合,域使用空白(空格或TAB)分開的,第一個域是一個命令的名字,其它的是作為參數來傳給它。Tcl解釋器對一個命令的求值過程分為兩部分:分析和執行。在分析階段,Tcl 解釋器運用規則識別出命令并把命令分成一個個獨立的單詞,同時進行必要的置換(substitution); 在執行階段,Tcl 解釋器會把第一個單詞當作命令名,并查看這個命令是否有定義,如果有定義就激活這個命令對應的C/C+過程,并把所有的單詞作為參數傳遞給該命令過程,讓命令過程進行處理。Tcl的命令名可以是內建的命令也可以是用戶建

4、的新命令,在應用程序中可用函數Tcl_CreateCommand來創建新的命令。所有的參數作為字符串來傳遞,命令自己會按其所需來解釋的參數的。另外關于Tcl的注釋有一個特殊的要求:''必須出現在Tcl解釋器期望命令的第一個字符出現的地方,才被當作注釋。例如:set a 100 # Not a commentset b 101 ; # this is a comment第一個例子中'#'及其后面的內容會被當作set 的參數而非注釋從而導致參數個數錯誤;但第二個被解釋為注釋,因為'#'前面有一個分號,而分號和換行一樣被看作是命令的分隔符。腳步命令:(

5、1)eval命令eval命令是一個用來構造和執行TCL腳本的命令,其語法為: eval arg arg .它可以接收一個或多個參數,然后把所有的參數以空格隔開組合到一起成為一個腳本,然后對這個腳本進行求值。(2)source命令source命令讀一個文件并把這個文件的內容作為一個腳本進行求值。例如:source e:/tcl&c/hello.tcl注意路徑的描述應該和UNIX相同,使用'/'而不是''。2、置換(Substitution)set x 10set y 100 + x上面命令執行后,y的值是“100 + x”而不是我們期望的110。這是因為T

6、cl解釋器在分析命令時,把所有的命令參數都當作字符串看待,所以x 被看作了字符串“100 + x”的一部分。如果我們想使用x的值'10' ,就必須告訴Tcl解釋器:我們在這里期望的是變量x的值,而非字符'x'。怎么告訴Tcl解釋器呢,這就要用到Tcl語言中提供的置換功能。Tcl提供三種形式的置換:變量置換、命令置換和反斜杠置換。每種置換都會導致一個或多個單詞本身被其他的值所代替。置換可以發生在包括命令名在內的每一個單詞中,而且置換可以嵌套。(1)變量置換(variable substitution)變量置換由一個符號標記,變量置換會導致變量的值而非變量(標識符)

7、本身被插入到字符串中。set x 10set y 100 + $x這時,y的值還不是我們想要的值110,而是10+100,因為Tcl解釋器把10+100看成是一個字符串而不是表達式;y要想得到值110,還必須用命令置換,使得Tcl會把10+100看成一個表達式并求值。(2)命令置換(command substitution)命令置換是由括起來的Tcl命令及其參數,命令置換會導致某一個命令的所有或部分單詞(參數)被另一個命令的結果所代替。set x 10set y expr 100+$x這時,y的值就是110了。這里當Tcl解釋器遇到字符''時,它就會把隨后的expr作為一個命令

8、名,從而激活與expr對應的C/C+過程,并把expr命令中變量置換后得到的'10+110'傳遞給該命令過程進行處理。注意,中必須是一個合法的Tcl腳本,長度不限。中腳本的值為最后一個命令的返回值,例如:有了命令置換,實際上就表示命令之間是可以嵌套的,即一個命令的結果可以作為別的命令的參數。(3)反斜杠置換(backslash subtitution)Tcl語言中的反斜杠置換類似于C語言中反斜杠的用法,主要用于在單詞符號中插入諸如換行符、空格、$等被Tcl解釋器當作特殊符號對待的字符。例如:set msg multiple space 如果沒有''的話,Tcl會

9、報錯,因為解釋器會把這里最后兩個單詞之間的空格認為是分隔符,于是發現set命令有多于兩個參數,從而報錯。加入了''后,空格不被當作分隔符,'multiple space'被認為是一個單詞(word)。(4)雙引號和花括號除了使用反斜杠外,Tcl提供另外兩種方法來使得解釋器把分隔符和置換符等特殊字符當作普通字符,而不作特殊處理,這就要使用雙引號和花括號()。Tcl解釋器對雙引號中的各種分隔符將不作處理,但是對換行符及和兩種置換符會照常處理。而在花括號中,所有特殊字符都將成為普通字符,失去其特殊意義,Tcl解釋器不會對其作特殊處理。二、Tcl變量數據類型Tcl只支持

10、一種數據類型:字符串(string)。所有的命令,命令的所有的參數,命令的結果,所有的變量都是字符串。請牢記這一點,所有的東西都是字符串。(然而字符串的實際解釋是依賴于其所處上下文。它有三種形式:命令, 表達式和表)。Tcl變量根據其結構的復雜程度分為“簡單變量”和“數組變量”兩類。(1)簡單變量一個Tcl的簡單變量包含兩個部分:名字和值,其中名字和值都可以是任意字符串。不過為了更好的使用變量置換功能,變量名最好按CC+語言中標識符的命名規則命名。這是因為Tcl解釋器在分析一個變量置換時,只把從符號往后直到第一個不是字母、數字或下劃線的字符之間的單詞符號作為要被置換的變量的名字。例如:set

11、a 2set a.1 5set b $a.1在最后一個命令行,我們希望把變量a.1的值付給b,但是Tcl解釋器在分析時只把$符號之后直到第一個不是字母、數字或下劃線的字符(這里是'.')之間的單詞符號(這里是'a')當作要被置換的變量的名字,所以Tcl解釋器把a置換成2,然后把字符串“2.1”付給變量b。這顯然與我們的初衷不同。當然,如果變量名中有不是字母、數字或下劃線的字符又要用變量置換,可以用花括號把變量名括起來。例如:set b $a.1(2)數組變量數組是一些元素的集合。Tcl的數組和一般編程語言中的數組有很大的區別。在Tcl中,不能單獨聲明一個數組,數

12、組只能和數組元素一起聲明。數組中數組元素的名字包含兩部分:數組名和數組中元素的名字,Tcl中數組元素的名字(下標可以為任何字符串。例如:set day(monday) 1 set day(tuesday) 2(3)重用結構及其操作1、string結構及其操作因為TCL把所有的輸入都當作字符串看待,所以TCL提供了較強的字符串操作功能【format】語法:format formatstring vlue value.format命令類似于ANSIC中的sprintf函數,它按formatstring提供的格式,把各個value的值組合到formatstring中形成一個新字符串,并返回。例如:s

13、et msg format "%s is %d years old" $name $age 【scab】語法:scan string formatsting varName varName .scan命令可以認為是format命令的逆,其功能類似于ANSI C中的sscanf函數。它按formatsting提供的格式分析string字符串,然后把結果存到變量varName中,注意除了空格和TAB鍵之外,string 和formatsting中的字符和'%'必須匹配。例如:scan "some 26 34" "some %d %d

14、" a b【regexp】語法:regexp switchs - exp string matchVar subMatchVar subMatchVar.regexp命令用于判斷正規表達式exp是否全部或部分匹配字符串string,匹配返回1,否則0。regexp可以設置一些開關(switchs,來控制匹配的具體方式,如:-nocase,-line等,其中- 表示這后面再沒有開關(switchs了,即使后面有以'-'開頭的參數也被當作正規表達式的一部分。 如果regexp命令后面有參數matchVar和subMatchVar,則所有的參數被當作變量名,如果變量不存在,

15、就會被生成。 regexp把匹配整個正規表達式的子字符串賦給第一個變量,匹配正規表達式的最左邊的子表達式的子字符串賦給第二個變量,依次類推,例如:regexp (0-9+) *(a-z+) " there is 100 apples" total num word 1 puts " $total ,$num,$word" 顯示結果為:100 apples ,100,apples其他具體的正則表達式規則請參考Tcl語言手冊【regsub】語法:regsub switchs exp string subSpec varnameregsub的第一個參數是一個整

16、個表達式,第二個參數是一個輸入字符串,這一點和regexp命令完全一樣,也是當匹配時返回1,否則返回0。不過regsub用第三個參數的值來替換字符串string中和正規表達式匹配的部分,第四個參數被認為是一個變量,替換后的字符串存入這個變量中。例如:regsub there "They live there lives " their x puts $x 顯示結果為:They live their lives【sting】語法:string subcmd arg arg.string命令具有強大的操作字符串的功能,并通過其中的subcmd來區別具體將要執行的string操作

17、。他們中的一些如下:string length stringstring range string first laststring index string charIndexstring tolower string first laststring replace string first last newstringstring equal -nocase -length int string1 string2string match -nocase pattern string 如果pattern 匹配string,那么返回1,否則返回0.string compare -nocase

18、 -length int string1 string2 如果有 -length 參數,那么只比較前 int 個字符string first string1 string2 startindex 在string2 中從頭查找與string1匹配的字符序列,如果找到,那么就返回匹配的第一個字母所在的位置(0-based)。如果沒有找到,那么返回-1。string trim string chars 返回值為:從string字符串的首尾刪除掉了字符集合chars中的字符后的字符串。如果沒有給出chars,那么將刪除掉spaces、tabs、newlines、carriage returns這些字符

19、.2、list結構及其操作list這個概念在TCL中是用來表示集合的。TCL中list是由一堆元素組成的有序集合,list可以嵌套定義,list每個元素可以是任意字符串,也可以是list。Tcl提供了很多基本命令對list進行操作:【list】語法:list value value.這個命令生成一個list,list的元素就是所有的value【concat】語法:concat list list.這個命令把多個list合成一個list.【llength】語法:llength list返回list的元素個數。【lindex】語法:lindex list index返回list的第index個(0

20、-based)元素。【lrange】語法:lrange list first last 返回list的第first (0-based)到第last (0-based)元素組成的串,如果last的值是end。就是從第first個直到串的最后。【linsert】語法:linsert list index value value.?返回一個新串,新串是把所有的value參數值插入list的第index個(0-based)元素之前得到。【lappend】語法:lappend varname value value.?把每個value的值作為一個元素附加到變量varname后面,并返回變量的新值,如果v

21、arname不存在,就生成這個變量。【lreplace】語法:lreplace list first last value value .返回一個新串,新串是把list的第firs (0-based)t到第last 個(0-based)元素用所有的value參數替換得到的。如果沒有value參數,就表示刪除第first到第last個元素。【lsort】語法:lsort options? list 這個命令返回把list排序后的串。options可以是如下值:-ascii 按ASCII字符的順序排序比較.這是缺省情況。-dictionary 按字典排序,與-ascii不同的地方是: (1)不考慮

22、大小寫 (2)如果元素中有數字的話,數字被當作整數來排序. 【lsearch】語法:lsearch -option list pattern 返回list中第一個匹配模式pattern的元素的索引,如果找不到匹配就返回-1。option取-exact、-glob、 -regexp是三種模式匹配的技術,缺省時使用-glob匹配。【join】語法:join list joinString這個命令把list的所有元素合并到一個字符串中,中間以joinString分開。缺省的joinString是空格。【split】語法:split string splitChars把字符串string按分隔符spl

23、itChars分成一個個單詞,返回由這些單詞組成的串。如果splitChars 是一個空字符,string被按字符分開。如果splitChars沒有給出,以空格為分隔符。3、file結構及其操作TCL提供了豐富的文件操作的命令。通過這些命令你可以對文件名進行操作(查找匹配某一模式的文件)、以順序或隨機方式讀寫文件、檢索系統保留的文件信息(如最后訪問時間)。3.1基本文件I/Opwd和UNIX下的pwd命令完全一樣, 沒有參數,返回當前目錄的完整路徑。cd 命令也和UNIX命令也一樣,使用一個參數,可以把工作目錄改變為參數提供的目錄。以下這個名為tgrep的過程,可以說明TCL文件I/O的基本特

24、點:proc tgrep pattern filename set f open $filename r while gets $f line if regexp $pattern $line puts stdout $line close $f open命令返回一個字符串用于表識打開的文件。當調用別的命令(如:gets,puts,close,對打開的文件進行操作時,就可以使用這個文件標識符。TCL有三個特定的文件標識: stdin,stdout和stderr ,分別對應標準輸入、標準輸出和錯誤通道,任何時候你都可以使用這三個文件標識。3.2隨即文件訪問默認文件輸入輸出方式是連續的:即每個ge

25、ts或 read命令返回的是上次gets或 read訪問位置后面的字節,每個puts命令寫數據是接著上次puts寫的位置接著寫。TCL提供了seek,tell和eof等命令使用戶可以非連續訪問文件。每個打開的打開文件都有訪問點,即下次讀寫開始的位置。文件打開時,訪問點總是被設置為文件的開頭或結尾,這取決于打開文件時使用的訪問模式。每次讀寫后訪問位置按訪問的字節數后移相應的位數。seek fileId offset origin 把fileId標識的文件的訪問點設置為相對于origin偏移量為offset的位置。origin可以是start,current,end,默認是start。tell f

26、ileId 返回fileId標識的文件的當前訪問位置。eof fileId 如果到達fileId標識的文件的末尾返回1,否則返回0。3.3文件操作和獲取文件信息【grob】語法:glob switches pattern pattern .glob命令的模式采用string match命令的匹配規則,返回匹配這個(些)模式的所有文件的列表。如:glob *.c *.hglob */ 只返回當前目錄的所有子目錄。【file】語法:file subcmd arg arg.file 通過眾多的subcmd子操作提供強大的文件操作和訪問能力。他們中的一些如下:file exists namefile

27、extension namefile mkdir dir dir .file copy -force - source targetfile rename -force - source targetfile delete -force - pathname pathname . 三、Tcl表達式(1)操作數Tcl表達式的操作數通常是整數或實數。整數一般是十進制的, 但如果整數前兩個字符是0x則這個整數被看作是十六進制的。Tcl的實數的寫法與ANSI C中完全一樣。(2)運算符Tcl中的運算符的語法形式和用法跟ANSI C中完全一致。另外,Tcl中提供了大量的常用數學函數來增強自身的數學運算和

28、處理能力,這些函數的形式和用法大都與ANSI C中的數學函數完全一致。四、Tcl流程控制TCL中的控制流和C語言類似,包括if、switch、for、while、foreach、break、continue等命令。(1)條件語句if $x>0 . elseif $x1 . elseif $x2 . else . 注意,上例中''一定要寫在上一行,因為如果不這樣,TCL 解釋器會認為if命令在換行符處已結束,下一行會被當成新的命令,從而導致錯誤的結果。在Tcl的其他流程控制命令的書寫中也要注意這個問題。書寫中還要注意的一個問題是if 和之間應該有一個空格,否則TCL解釋器會

29、把'if'作為一個整體當作一個命令名,從而導致錯誤。switch option $x a - b incr t1 c incr t2 default incr t3 其中可選參數option,表示進行匹配的方式。TCL支持三種匹配方式:-exact方式,-glob方式,-regexp方式,缺省情況表示-glob方式。-exact方式表示的是精確匹配,-glob方式的匹配方式和string match 命令的匹配方式相同,-regexp方式是正規表達式匹配方式。條件中a的后面跟一個''表示使用和下一個模式相同的腳本,default表示匹配任意值。一旦switch命

30、令 找到一個模式匹配,就執行相應的腳本,并返回腳本的值作為switch命令的返回值。(2)循環語句for init test reinit body 參數init是一個初始化腳本,第二個參數test是一個表達式,用來決定循環什么時候中斷,第三個參數reinit是一個重新初始化的腳本,第四個參數body也是腳本。如:set b " " for set i expr llength $a -1 $i>=0 incr i -1 lappend b lindex $a $i while的例子假設變量 a 是一個鏈表,下面的腳本把a 的值復制到b: set b " &

31、quot; set i expr llength $a -1 while $i>=0 lappend b lindex $a $i incr i -1 foreach命令的兩種形式:1、foreach varName list body 第一個參數varName是一個變量,第二個參數list 是一個表(有序集合),第三個參數body是循環體。每次取得鏈表的一個元素,都會執行循環體一次。如:set b " " foreach i $aset b linsert $b 0 $i 2、foreach varlist1 list1 varlist2 list2 . body本

32、語句是上一個的增強形式:可以有多個變量、列表對參與條件判斷五、Tcl過程TCL支持過程的定義和調用,在TCL中,過程可以看作是用TCL腳本實現的命令,效果與TCL的固有命令相似。我們可以在任何時候使用proc命令定義自己的過程,TCL中的過程類似于C中的函數。TCL中過程是由proc命令產生的。例如: proc add x y expr $x+$yproc命令的第一個參數是你要定義的過程的名字,第二個參數是過程的參數列表,參數之間用空格隔開,第三個參數是一個TCL腳本,代表過程體。 proc生成一個新的命令,可以象固有命令一樣調用:add 1 2 3在定義過程時,你可以利用return命令在任何地方返回你想要的值。return命令迅速中斷過程,并把它的參數作為過程的結果。(1)局部變量和全局變量對于在過程中定義的變量,因為它們只能在過程中被訪問,并且當過程退出時會被自動刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。TCL中局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過程的內部;全局變量的作用域則不

溫馨提示

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

評論

0/150

提交評論