版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、TCL腳本語(yǔ)言介紹2、TCL的語(yǔ)法3、TCL的變量4、TCL的表達(dá)式5、TCL常用命令6、TCL的控制7、TCL的過程8、TCL的字符串操作9、TCL的list10.學(xué)習(xí)TCL的一些建議和方法針對(duì)TCl腳本語(yǔ)言的新手2小時(shí)田顯蘭使沒有接觸過TCL腳本語(yǔ)言的同事對(duì)TCL腳本語(yǔ)言的基礎(chǔ)概念和基礎(chǔ)知識(shí)有一定的了解??梢允褂肨CL腳本語(yǔ)言進(jìn)行簡(jiǎn)單的編程。培訓(xùn)目的培訓(xùn)對(duì)象培訓(xùn)講師學(xué)習(xí)重點(diǎn)培訓(xùn)課時(shí)1、TCL腳本語(yǔ)言介紹針對(duì)TCl腳本語(yǔ)言的新手2小時(shí)田顯蘭使11、TCL腳本語(yǔ)言介紹TCL腳本語(yǔ)言培訓(xùn)TCL(Tool
Command
Language)是一種解釋執(zhí)行的腳本語(yǔ)言提供通用的編程能力:支持變量、過程和控制結(jié)構(gòu),經(jīng)常被用于快速原型開發(fā),腳本編程,GUI和測(cè)試等方面TCL擁有一個(gè)功能強(qiáng)大的固有的核心命令集,同時(shí)支持根據(jù)需要對(duì)TCL語(yǔ)言進(jìn)行擴(kuò)展解釋器同等對(duì)待固有命令集和擴(kuò)展命令集
TCL的優(yōu)點(diǎn):語(yǔ)法簡(jiǎn)單,解釋執(zhí)行,可擴(kuò)展,跨平臺(tái)1、TCL腳本語(yǔ)言介紹TCL腳本語(yǔ)言培訓(xùn)TCL(Tool2、TCL的語(yǔ)法簡(jiǎn)單的講:TCL語(yǔ)言的語(yǔ)法就是一些TCL解釋器怎樣對(duì)TCL命令進(jìn)行分析的規(guī)則的集合。TCL命令的基本語(yǔ)法為:commandarg1arg2arg3…
TCL腳本語(yǔ)言培訓(xùn)2、TCL的語(yǔ)法簡(jiǎn)單的講:TCL腳本語(yǔ)言培訓(xùn)2、TCL的語(yǔ)法2-1、腳本、命令和單詞符號(hào)一個(gè)TCL腳本可以包含一個(gè)或多個(gè)命令。命令之間必須用換行符或分號(hào)隔開。在所有TCL腳本中,系統(tǒng)內(nèi)部的命令名是小寫格式Example:
seta100setb101setc102;setd103TCL的每一個(gè)命令包含一個(gè)或幾個(gè)單詞,第一個(gè)單詞代表命令名,另外的單詞則是這個(gè)命令的參數(shù),單詞之間必須用空格或TAB鍵隔開。命令之間是可以嵌套的Example:
seta 100setb[expr$a+1]TCL腳本語(yǔ)言培訓(xùn)2、TCL的語(yǔ)法2-1、腳本、命令和單詞符號(hào)一個(gè)TCL腳本可2-2、置換的引入2、TCL的語(yǔ)法TCL解釋器對(duì)一個(gè)命令的求值過程分為兩部分:分析和執(zhí)行。在分析階段,TCL解釋器運(yùn)用規(guī)則把命令分成一個(gè)個(gè)獨(dú)立的單詞,同時(shí)進(jìn)行必要的置換(substitution);在執(zhí)行階段,TCL解釋器會(huì)把第一個(gè)單詞當(dāng)作命令名,并查看這個(gè)命令是否有定義,如果有定義就激活這個(gè)命令對(duì)應(yīng)的C/C++過程,并把所有的單詞作為參數(shù)傳遞給該命令過程,讓命令過程進(jìn)行處理。Example:
setlog“test”setcurrentfilename“test.tcl”LOG::AppErr$log[expr$[namespacecurrent]::currentfilename]“error”
置換可以發(fā)生在包含命令名在內(nèi)的每一個(gè)單詞中,而且置換可以嵌套Example:
seta1setb$a2TCL提供三種形式的置換:變量置換、命令置換和反斜杠置換。TCL腳本語(yǔ)言培訓(xùn)2-2、置換的引入2、TCL的語(yǔ)法TCL解釋器對(duì)一個(gè)命令的求2-3、三種置換類型2、TCL的語(yǔ)法變量置換由一個(gè)$符號(hào)標(biāo)識(shí),變量置換會(huì)導(dǎo)致變量的值插入一個(gè)單詞中。TCL解釋器在分析一個(gè)變量置換時(shí),只把從$往后直到第一個(gè)不是字符,數(shù)字或下劃線的字符之間的單詞符號(hào)作為被置換的變量的名字Example:
seta“hello”;seta_1“hello”;seta-1“hello”setb“$aworld!”;setc“$a_1world!”;setd“$a-1world!”命令置換是由[]括起來的TCL命令及其參數(shù)。命令置換會(huì)導(dǎo)致某一個(gè)命令的所有或部分單詞被另一個(gè)命令的結(jié)果所代替。[]中必須是一個(gè)合法的TCL腳步,長(zhǎng)度不限。[]中腳本的值為最后一個(gè)命令的返回值Example:setb[expr100*10]反斜杠替換相當(dāng)于C語(yǔ)言中反斜杠的作用,主要用于在單詞符號(hào)中插入諸如換行符、空格、[、$等被TCL解釋器當(dāng)作特殊符號(hào)對(duì)待的字符Example:seta\[a]setb\$100TCL腳本語(yǔ)言培訓(xùn)2-3、三種置換類型2、TCL的語(yǔ)法變量置換由一個(gè)$符號(hào)2-4、雙引號(hào)和花括號(hào)2、TCL的語(yǔ)法除了使用反斜杠外,TCL提供另外兩種方法來使得解釋器把分隔符和置換符等特殊字符當(dāng)作普通字符,而不作特殊處理,這就要使用雙引號(hào)(“”)和花括號(hào)({})。
TCL解釋器對(duì)雙引號(hào)中的各種分隔符將不作處理,但是對(duì)換行符及$和[]兩種置換符會(huì)照常處理。Example:
seta1;setb2puts“c=[expr$a+$b]”而在花括號(hào)中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會(huì)對(duì)其作特殊處理。Example:
seta1;setb2puts{c=[expr$a+$b]}TCL腳本語(yǔ)言培訓(xùn)2-4、雙引號(hào)和花括號(hào)2、TCL的語(yǔ)法除了使用反斜杠外,TC2-5、注釋2、TCL的語(yǔ)法TCL中的注釋符是‘?!!椭钡剿谛薪Y(jié)尾的所有字符都被TCL看作注釋,TCL解釋器對(duì)注釋將不作任何處理。不過,要注意的是,‘?!仨毘霈F(xiàn)在TCL解釋器期望命令的第一個(gè)字符出現(xiàn)的地方,才被當(dāng)作注釋。Example:
#Thisisacommentseta100#Notacommentsetb100;#ThisisacommentTCL腳本語(yǔ)言培訓(xùn)2-5、注釋2、TCL的語(yǔ)法TCL中的注釋符是‘#’,‘?!?、變量TCL腳本語(yǔ)言培訓(xùn)TCL支持兩種類型的變量:簡(jiǎn)單變量和數(shù)組。簡(jiǎn)單變量包含兩個(gè)部分:名字和值。名字和值都可以是任意字符串。例如一個(gè)名為“13237&*:hdgg”的變量在TCL中都是合法的。不過為了更好的使用置換(substitution),變量名最好按C\C++語(yǔ)言中標(biāo)識(shí)符的命名規(guī)則命名。TCL解釋器在分析一個(gè)變量置換時(shí),只把從$符號(hào)往后直到第一個(gè)不是字母、數(shù)字或下劃線的字符之間的單詞符號(hào)作為要被置換的變量的名字。數(shù)組是一些元素的集合。TCL的數(shù)組和普通計(jì)算機(jī)語(yǔ)言中的數(shù)組有很大的區(qū)別。在TCL中,不能單獨(dú)聲明一個(gè)數(shù)組,數(shù)組只能和數(shù)組元素一起聲明。數(shù)組中,數(shù)組元素的名字包含兩部分:數(shù)組名和數(shù)組中元素的名字,TCL中數(shù)組元素的名字(下標(biāo)〕可以為任何字符串Example:
setday(monday)1setday(tuesday)2
TCL不能支持復(fù)雜的數(shù)據(jù)類型
3、變量TCL腳本語(yǔ)言培訓(xùn)TCL支持兩種類型的變量:簡(jiǎn)單變量4、表達(dá)式TCL腳本語(yǔ)言培訓(xùn)TCL中的表達(dá)式類似于ANSIC的表達(dá)式。表達(dá)式由操作數(shù)和操作符構(gòu)成。TCL表達(dá)式的操作數(shù)通常是整數(shù)或?qū)崝?shù)。整數(shù)一般是十進(jìn)制的,但如果整數(shù)的第一個(gè)字符是0(zero),那么TCL將把這個(gè)整數(shù)看作八進(jìn)制的,如果前兩個(gè)字符是0x則這個(gè)整數(shù)被看作是十六進(jìn)制的。TCL的實(shí)數(shù)的寫法與ANSIC中完全一樣。TCL中用到的運(yùn)算符,它們的語(yǔ)法形式和用法跟ANSIC中很相似。需要注意的一點(diǎn)是,數(shù)學(xué)函數(shù)并不是命令,只在表達(dá)式中出現(xiàn)才有意義。expr
命令:exprarg?arg...?expr可以有一個(gè)或多個(gè)參數(shù),它把所有的參數(shù)組合到一起,作為一個(gè)表達(dá)式,然后求值Example:
expr1+2*3
4、表達(dá)式TCL腳本語(yǔ)言培訓(xùn)TCL中的表達(dá)式類似于ANSI5-1、set、puts、unset5、TCL的常用命令TCL腳本語(yǔ)言培訓(xùn)set命令用于定義變量或讀取變量的值命令格式:set
varName?value?
Example:settest100settestputs命令用于寫指定內(nèi)容到指定通道命令格式:
puts?-nonewline??channelId?string
Example:
puts“helloworld!”puts–nonewline“hello,ShangHai!“unset命令用于刪除一個(gè)變量命令格式:unset?-nocomplain??--??namenamename...?
Example:
unsettest5-1、set、puts、unset5、TCL的常用命令TC5-2、append、incr5、TCL的常用命令TCL腳本語(yǔ)言培訓(xùn)append命令用于把文本加到一個(gè)變量的后面命令格式:append
varName?valuevaluevalue...?Example:
appendtest“hello”
appenda$bvsseta$a$bincr命令用于增加變量的值命令格式:incr
varName?increment?
Example:
incrtest2incrtestincrtest-15-2、append、incr5、TCL的常用命令TCL腳本6-1、if6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:if
expr1?then?body1
elseif
expr2?then?body2
elseif...?else??bodyN?
Example:
if{$vbl==1}{puts"vblisone"}
if{$vbl==1}{puts"vblisone"}else{puts"vblisnotone"}
if{$vbl==1}{puts"vblisone"}elseif{$vbl==2}{puts"vblistwo"}else{puts"vblisnotoneortwo"}
if{$vbl==1||$vbl==2||$vbl==3}then{puts"vblisone,twoorthree"}注意:if和{之間一定要有空格,body的{一定要與if同行6-1、if6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:6-2、for6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:for
starttestnextbody
Example:
for{setx0}{$x<10}{incrx}{puts"xis$x“}
for{setx0}$x<10{incrx}{puts"xis$x"}注意:test必須用花括號(hào)括起來,推遲置換。6-2、for6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)6-3、while6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:while
testbody
Example:
setx0
while{$x<10}{puts"xis$x"incrx}注意:test必須用花括號(hào)括起來,推遲置換。6-3、while6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式6-4、foreach6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:foreach
varnamelistbody
foreach
varlist1list1?varlist2list2...?body
Example:
setvalues{13572468}foreachx$values{puts"$x}
setx{}
foreach{ij}{abcdef}{lappendx$j$i}
foreachi{abc}j{defg}{lappendx$i$j}
6-4、foreach6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令6-5、switch6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:switch?options?stringpatternbody?patternbody...?
switch?options?string{patternbody?patternbody...?}
Example:
switchxyz{a-b{expr{1}}c{expr{2}}default{expr{3}}}6-5、switch6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)TCL支持過程的定義和調(diào)用,在TCL中,過程可以看作是用TCL腳本實(shí)現(xiàn)的命令,效果與TCL的固有命令相似。我們可以在任何時(shí)候使用proc命令定義自己的過程,TCL中的過程類似于C中的函數(shù)。過程的返回值是過程體中最后執(zhí)行的那條命令的返回值
proc命令用于創(chuàng)建一個(gè)TCL過程命令格式:proc
nameargsbodyExample:procprintArgumentsargs{foreacharg$args{puts$arg}}procmult{varName{multiplier2}}{upvar1$varNamevarsetvar[expr{$var*$multiplier}]}7-1、過程的定義7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)TCL支持過程的定義和調(diào)用7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)
TCL支持三種參數(shù)類型:無參數(shù)、缺省參數(shù)、可變參數(shù)Example:procadd{}{expr2+3}procadd{val1{val22}{val33}}{expr$val1+$val2+$val3}procadd{val1args}{setsum$val1foreachi$args{incrsum$i}return$sum}7-2、過程的參數(shù)7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)TCL支持三種參數(shù)類型:7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)對(duì)于在過程中定義的變量,因?yàn)樗鼈冎荒茉谶^程中被訪問,并且當(dāng)過程退出時(shí)會(huì)被自動(dòng)刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過程的內(nèi)部;全局變量的作用域則不包括所有過程的內(nèi)部。這一點(diǎn)和C語(yǔ)言有很大的不同.如果我們想在過程內(nèi)部引用一個(gè)全局變量的值,可以使用global命令Example:
seta100
procsample{x}{globalaincrareturn[expr$a+$x]}
7-3、局部變量與全局變量7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)對(duì)于在過程中定義的變量,因7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)upvar命令用于用戶在過程中對(duì)全局變量或其他過程中的局部變量進(jìn)行訪問命令格式:upvar?level?otherVarmyVar?otherVarmyVar...?
upvar命令的第一個(gè)參數(shù)otherVar是我們希望以引用方式訪問的參數(shù)的名字,第二個(gè)參數(shù)myVar是這個(gè)過程中的局部變量的名字,一旦使用了upvar命令把otherVar和myVar綁定,那么在過程中對(duì)局部變量myVar的讀寫就相當(dāng)于對(duì)這個(gè)過程的調(diào)用者中otherVar所代表的局部變量的讀寫。level參數(shù)表示:調(diào)用upvar命令的過程相對(duì)于我們希望引用的變量myVar在調(diào)用棧中相對(duì)位置Example:proctemp{arg}{upvar$argbsetb[expr$b+2]}
upvar2otherx;#訪問當(dāng)前過程的調(diào)用者的調(diào)用者中的otherupvar#0otherx;#訪問全局的變量other7-4、引用upvar7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)upvar命令用于用戶在過8、TCL的字符串操作(一)TCL腳本語(yǔ)言培訓(xùn)string命令具有強(qiáng)大的操作字符串的功能,其中的option選項(xiàng)多達(dá)20個(gè)stringcompare?-nocase??-lengthint?string1string2把字符串string1和string2進(jìn)行比較,返回值為-1、0或1,分別對(duì)應(yīng)string1小于、等于或大于string2。如果有-length參數(shù),那么只比較前int個(gè)字符,如果int為負(fù)數(shù),那么這個(gè)參數(shù)被忽略。如果有-nocase參數(shù),那么比較時(shí)不區(qū)分大小寫。
stringequal?-nocase??-lengthint?string1
string2
把字符串string1和string2進(jìn)行比較,如果兩者相同,返回值為1,否則返回0。其他參數(shù)與stringcompare同。stringfirststring1
string2?startindex?在string2中從頭查找與string1匹配的字符序列,如果找到,那么就返回匹配的第一個(gè)字母所在的位置(0-based)。如果沒有找到,那么返回-1。如果給出了startindex變量,那么將從startindex處開始查找。8、TCL的字符串操作(一)TCL腳本語(yǔ)言培訓(xùn)string8、TCL的字符串操作(二)TCL腳本語(yǔ)言培訓(xùn)stringindexstring
charIndex
返回string中第charIndex個(gè)字符(0-based)。charIndex可以是下面的值:整數(shù)n:字符串中第n個(gè)字符(0-based)end:最后一個(gè)字符end-整數(shù)n:倒數(shù)第n個(gè)字符。stringindex"abcd"end-1返回字符'c'如果charIndex小于0,或者大于字符串string的長(zhǎng)度,那么返回空。stringlaststring1string2?startindex?參照stringfirst.唯一的區(qū)別是從后往前查找stringlengthstring
返回字符串string的長(zhǎng)度.stringmatch?-nocase?pattern
string
如果pattern匹配string,那么返回1,否則返回0.如果有-nocase參數(shù),那么就不區(qū)分大小寫.8、TCL的字符串操作(二)TCL腳本語(yǔ)言培訓(xùn)string8、TCL的字符串操作(三)TCL腳本語(yǔ)言培訓(xùn)stringrangestring
first
last返回字符串string中從第first個(gè)到第last個(gè)字符的子字符串(0-based)。如果first<0,那么first被看作0,如果last大于或等于字符串的長(zhǎng)度,那么last被看作end,如果first比last大,那么返回空。stringrepeatstring
count返回值為:重復(fù)了string字符串count次的字符串stringreplacestring
first
last?newstring?返回值為:從字符串string中刪除了第first到第last個(gè)字符(0-based)的字符串,如果給出了newstring變量,那么就用newstring替換從第first到第last個(gè)字符。如果first<0,那么first被看作0,如果last大于或等于字符串的長(zhǎng)度,那么last被看作end,如果first比last大或者大于字符串string的長(zhǎng)度或者last小于0,那么原封不動(dòng)的返回string
stringtolowerstring?first??last?返回值為:把字符串string轉(zhuǎn)換成小寫后的字符串,如果給出了first和last變量,就只轉(zhuǎn)換first和last之間的字符。8、TCL的字符串操作(三)TCL腳本語(yǔ)言培訓(xùn)string9、TCL的list(一)TCL腳本語(yǔ)言培訓(xùn)list這個(gè)概念在TCL中是用來表示集合的。TCL中l(wèi)ist是由一堆元素組成的有序集合,list可以嵌套定義,list每個(gè)元素可以是任意字符串,也可以是list。list是TCL中比較重要的一種數(shù)據(jù)結(jié)構(gòu),對(duì)于編寫復(fù)雜的腳本有很大的幫助,TCL提供了很多基本命令對(duì)list進(jìn)行操作
list命令用于創(chuàng)建一個(gè)list命令格式:list?valuevalue...?concat命令把多個(gè)list合成一個(gè)list,每個(gè)list變成新list的一個(gè)元素命令格式:concatlist?list...?lindex命令返回list的第index個(gè)(0-based)元素命令格式:lindexlistindexllength命令返回list的元素個(gè)數(shù)命令格式:llengthlist9、TCL的list(一)TCL腳本語(yǔ)言培訓(xùn)list這個(gè)概念9、TCL的list(二)TCL腳本語(yǔ)言培訓(xùn)linsert命令返回一個(gè)新串,新串是把所有的value參數(shù)值插入list的第index個(gè)(0-based)元素之前得到命令格式:linsertlistindexvalue?value...?lreplace命令返回一個(gè)新串,新串是把list的第first(0-based)到第last個(gè)(0-based)元素用所有的value參數(shù)替換得到的。如果沒有value參數(shù),就表示刪除第first到第last個(gè)元素。命令格式:lreplacelistfirstlast?valuevalue...?lrange命令返回list的第first(0-based)到第last(0-based)元素組成的串,如果last的值是end。就是從第first個(gè)直到串的最后命令格式:lrangelistfirstlastlappend命令把每個(gè)value的值作為一個(gè)元素附加到變量varname后面,并返回變量的新值,如果varname不存在,就生成這個(gè)變量命令格式:lappendvarnamevalue?value...?9、TCL的list(二)TCL腳本語(yǔ)言培訓(xùn)linsert命9、TCL的list(三)TCL腳本語(yǔ)言培訓(xùn)lsearch命令返回list中第一個(gè)匹配模式pattern的元素的索引,如果找不到匹配就返回-1命令格式:lsearch?-exact??-glob??-regexp?listpattern-exact、-glob、-regexp是三種模式匹配的技術(shù)。-exact表示精確匹配;-glob的匹配方式和stringmatch命令的匹配方式相同;-regexp表示正規(guī)表達(dá)式匹配,缺省時(shí)使用-glob匹配lsort命令返回把list排序后的串命令格式:
lsort?options?listoptions可以是如下值:-ascii按ASCII字符的順序排序比較.這是缺省情況。-dictionary按字典排序,與-ascii不同的地方是:(1)不考慮大小寫(2)如果元素中有數(shù)字的話,數(shù)字被當(dāng)作整數(shù)來排序.因此:bigBoy排在bigbang和bigboy之間,x10y排在x9y和x11y之間.-integer把list的元素轉(zhuǎn)換成整數(shù),按整數(shù)排序.-real把list的元素轉(zhuǎn)換成浮點(diǎn)數(shù),按浮點(diǎn)數(shù)排序.-increasing升序(按ASCII字符比較)-decreasing降序(按ASCII字符比較)-commandcommandTCL自動(dòng)利用command命令把每?jī)蓚€(gè)元素一一比較,然后給出排序結(jié)果。9、TCL的list(三)TCL腳本語(yǔ)言培訓(xùn)lsearch9、TCL的list(四)TCL腳本語(yǔ)言培訓(xùn)
split命令把字符串string按分隔符splitChars分成一個(gè)個(gè)單詞,返回由這些單詞組成的串。如果splitChars是一個(gè)空字符{},string被按字符分開。如果splitChars沒有給出,以空格為分隔符命令格式:splitstring?splitChars?join命令把list的所有元素合并到一個(gè)字符串中,中間以joinString分開。缺省的joinString是空格命令格式:joinlist?joinString?Join命令式split命令的逆。9、TCL的list(四)TCL腳本語(yǔ)言培訓(xùn)split命令10、學(xué)習(xí)TCL的一些建議和方法TCL腳本語(yǔ)言培訓(xùn)Help幫助文檔2.命令幫助提示3.教程文檔4.實(shí)地操作10、學(xué)習(xí)TCL的一些建議和方法TCL腳本語(yǔ)言培訓(xùn)Help幫謝謝各位!謝謝各位!30TCL腳本語(yǔ)言培訓(xùn)課件31TCL腳本語(yǔ)言培訓(xùn)課件321、TCL腳本語(yǔ)言介紹2、TCL的語(yǔ)法3、TCL的變量4、TCL的表達(dá)式5、TCL常用命令6、TCL的控制7、TCL的過程8、TCL的字符串操作9、TCL的list10.學(xué)習(xí)TCL的一些建議和方法針對(duì)TCl腳本語(yǔ)言的新手2小時(shí)田顯蘭使沒有接觸過TCL腳本語(yǔ)言的同事對(duì)TCL腳本語(yǔ)言的基礎(chǔ)概念和基礎(chǔ)知識(shí)有一定的了解??梢允褂肨CL腳本語(yǔ)言進(jìn)行簡(jiǎn)單的編程。培訓(xùn)目的培訓(xùn)對(duì)象培訓(xùn)講師學(xué)習(xí)重點(diǎn)培訓(xùn)課時(shí)1、TCL腳本語(yǔ)言介紹針對(duì)TCl腳本語(yǔ)言的新手2小時(shí)田顯蘭使331、TCL腳本語(yǔ)言介紹TCL腳本語(yǔ)言培訓(xùn)TCL(Tool
Command
Language)是一種解釋執(zhí)行的腳本語(yǔ)言提供通用的編程能力:支持變量、過程和控制結(jié)構(gòu),經(jīng)常被用于快速原型開發(fā),腳本編程,GUI和測(cè)試等方面TCL擁有一個(gè)功能強(qiáng)大的固有的核心命令集,同時(shí)支持根據(jù)需要對(duì)TCL語(yǔ)言進(jìn)行擴(kuò)展解釋器同等對(duì)待固有命令集和擴(kuò)展命令集
TCL的優(yōu)點(diǎn):語(yǔ)法簡(jiǎn)單,解釋執(zhí)行,可擴(kuò)展,跨平臺(tái)1、TCL腳本語(yǔ)言介紹TCL腳本語(yǔ)言培訓(xùn)TCL(Tool2、TCL的語(yǔ)法簡(jiǎn)單的講:TCL語(yǔ)言的語(yǔ)法就是一些TCL解釋器怎樣對(duì)TCL命令進(jìn)行分析的規(guī)則的集合。TCL命令的基本語(yǔ)法為:commandarg1arg2arg3…
TCL腳本語(yǔ)言培訓(xùn)2、TCL的語(yǔ)法簡(jiǎn)單的講:TCL腳本語(yǔ)言培訓(xùn)2、TCL的語(yǔ)法2-1、腳本、命令和單詞符號(hào)一個(gè)TCL腳本可以包含一個(gè)或多個(gè)命令。命令之間必須用換行符或分號(hào)隔開。在所有TCL腳本中,系統(tǒng)內(nèi)部的命令名是小寫格式Example:
seta100setb101setc102;setd103TCL的每一個(gè)命令包含一個(gè)或幾個(gè)單詞,第一個(gè)單詞代表命令名,另外的單詞則是這個(gè)命令的參數(shù),單詞之間必須用空格或TAB鍵隔開。命令之間是可以嵌套的Example:
seta 100setb[expr$a+1]TCL腳本語(yǔ)言培訓(xùn)2、TCL的語(yǔ)法2-1、腳本、命令和單詞符號(hào)一個(gè)TCL腳本可2-2、置換的引入2、TCL的語(yǔ)法TCL解釋器對(duì)一個(gè)命令的求值過程分為兩部分:分析和執(zhí)行。在分析階段,TCL解釋器運(yùn)用規(guī)則把命令分成一個(gè)個(gè)獨(dú)立的單詞,同時(shí)進(jìn)行必要的置換(substitution);在執(zhí)行階段,TCL解釋器會(huì)把第一個(gè)單詞當(dāng)作命令名,并查看這個(gè)命令是否有定義,如果有定義就激活這個(gè)命令對(duì)應(yīng)的C/C++過程,并把所有的單詞作為參數(shù)傳遞給該命令過程,讓命令過程進(jìn)行處理。Example:
setlog“test”setcurrentfilename“test.tcl”LOG::AppErr$log[expr$[namespacecurrent]::currentfilename]“error”
置換可以發(fā)生在包含命令名在內(nèi)的每一個(gè)單詞中,而且置換可以嵌套Example:
seta1setb$a2TCL提供三種形式的置換:變量置換、命令置換和反斜杠置換。TCL腳本語(yǔ)言培訓(xùn)2-2、置換的引入2、TCL的語(yǔ)法TCL解釋器對(duì)一個(gè)命令的求2-3、三種置換類型2、TCL的語(yǔ)法變量置換由一個(gè)$符號(hào)標(biāo)識(shí),變量置換會(huì)導(dǎo)致變量的值插入一個(gè)單詞中。TCL解釋器在分析一個(gè)變量置換時(shí),只把從$往后直到第一個(gè)不是字符,數(shù)字或下劃線的字符之間的單詞符號(hào)作為被置換的變量的名字Example:
seta“hello”;seta_1“hello”;seta-1“hello”setb“$aworld!”;setc“$a_1world!”;setd“$a-1world!”命令置換是由[]括起來的TCL命令及其參數(shù)。命令置換會(huì)導(dǎo)致某一個(gè)命令的所有或部分單詞被另一個(gè)命令的結(jié)果所代替。[]中必須是一個(gè)合法的TCL腳步,長(zhǎng)度不限。[]中腳本的值為最后一個(gè)命令的返回值Example:setb[expr100*10]反斜杠替換相當(dāng)于C語(yǔ)言中反斜杠的作用,主要用于在單詞符號(hào)中插入諸如換行符、空格、[、$等被TCL解釋器當(dāng)作特殊符號(hào)對(duì)待的字符Example:seta\[a]setb\$100TCL腳本語(yǔ)言培訓(xùn)2-3、三種置換類型2、TCL的語(yǔ)法變量置換由一個(gè)$符號(hào)2-4、雙引號(hào)和花括號(hào)2、TCL的語(yǔ)法除了使用反斜杠外,TCL提供另外兩種方法來使得解釋器把分隔符和置換符等特殊字符當(dāng)作普通字符,而不作特殊處理,這就要使用雙引號(hào)(“”)和花括號(hào)({})。
TCL解釋器對(duì)雙引號(hào)中的各種分隔符將不作處理,但是對(duì)換行符及$和[]兩種置換符會(huì)照常處理。Example:
seta1;setb2puts“c=[expr$a+$b]”而在花括號(hào)中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會(huì)對(duì)其作特殊處理。Example:
seta1;setb2puts{c=[expr$a+$b]}TCL腳本語(yǔ)言培訓(xùn)2-4、雙引號(hào)和花括號(hào)2、TCL的語(yǔ)法除了使用反斜杠外,TC2-5、注釋2、TCL的語(yǔ)法TCL中的注釋符是‘#’,‘?!椭钡剿谛薪Y(jié)尾的所有字符都被TCL看作注釋,TCL解釋器對(duì)注釋將不作任何處理。不過,要注意的是,‘?!仨毘霈F(xiàn)在TCL解釋器期望命令的第一個(gè)字符出現(xiàn)的地方,才被當(dāng)作注釋。Example:
#Thisisacommentseta100#Notacommentsetb100;#ThisisacommentTCL腳本語(yǔ)言培訓(xùn)2-5、注釋2、TCL的語(yǔ)法TCL中的注釋符是‘?!!?、變量TCL腳本語(yǔ)言培訓(xùn)TCL支持兩種類型的變量:簡(jiǎn)單變量和數(shù)組。簡(jiǎn)單變量包含兩個(gè)部分:名字和值。名字和值都可以是任意字符串。例如一個(gè)名為“13237&*:hdgg”的變量在TCL中都是合法的。不過為了更好的使用置換(substitution),變量名最好按C\C++語(yǔ)言中標(biāo)識(shí)符的命名規(guī)則命名。TCL解釋器在分析一個(gè)變量置換時(shí),只把從$符號(hào)往后直到第一個(gè)不是字母、數(shù)字或下劃線的字符之間的單詞符號(hào)作為要被置換的變量的名字。數(shù)組是一些元素的集合。TCL的數(shù)組和普通計(jì)算機(jī)語(yǔ)言中的數(shù)組有很大的區(qū)別。在TCL中,不能單獨(dú)聲明一個(gè)數(shù)組,數(shù)組只能和數(shù)組元素一起聲明。數(shù)組中,數(shù)組元素的名字包含兩部分:數(shù)組名和數(shù)組中元素的名字,TCL中數(shù)組元素的名字(下標(biāo)〕可以為任何字符串Example:
setday(monday)1setday(tuesday)2
TCL不能支持復(fù)雜的數(shù)據(jù)類型
3、變量TCL腳本語(yǔ)言培訓(xùn)TCL支持兩種類型的變量:簡(jiǎn)單變量4、表達(dá)式TCL腳本語(yǔ)言培訓(xùn)TCL中的表達(dá)式類似于ANSIC的表達(dá)式。表達(dá)式由操作數(shù)和操作符構(gòu)成。TCL表達(dá)式的操作數(shù)通常是整數(shù)或?qū)崝?shù)。整數(shù)一般是十進(jìn)制的,但如果整數(shù)的第一個(gè)字符是0(zero),那么TCL將把這個(gè)整數(shù)看作八進(jìn)制的,如果前兩個(gè)字符是0x則這個(gè)整數(shù)被看作是十六進(jìn)制的。TCL的實(shí)數(shù)的寫法與ANSIC中完全一樣。TCL中用到的運(yùn)算符,它們的語(yǔ)法形式和用法跟ANSIC中很相似。需要注意的一點(diǎn)是,數(shù)學(xué)函數(shù)并不是命令,只在表達(dá)式中出現(xiàn)才有意義。expr
命令:exprarg?arg...?expr可以有一個(gè)或多個(gè)參數(shù),它把所有的參數(shù)組合到一起,作為一個(gè)表達(dá)式,然后求值Example:
expr1+2*3
4、表達(dá)式TCL腳本語(yǔ)言培訓(xùn)TCL中的表達(dá)式類似于ANSI5-1、set、puts、unset5、TCL的常用命令TCL腳本語(yǔ)言培訓(xùn)set命令用于定義變量或讀取變量的值命令格式:set
varName?value?
Example:settest100settestputs命令用于寫指定內(nèi)容到指定通道命令格式:
puts?-nonewline??channelId?string
Example:
puts“helloworld!”puts–nonewline“hello,ShangHai!“unset命令用于刪除一個(gè)變量命令格式:unset?-nocomplain??--??namenamename...?
Example:
unsettest5-1、set、puts、unset5、TCL的常用命令TC5-2、append、incr5、TCL的常用命令TCL腳本語(yǔ)言培訓(xùn)append命令用于把文本加到一個(gè)變量的后面命令格式:append
varName?valuevaluevalue...?Example:
appendtest“hello”
appenda$bvsseta$a$bincr命令用于增加變量的值命令格式:incr
varName?increment?
Example:
incrtest2incrtestincrtest-15-2、append、incr5、TCL的常用命令TCL腳本6-1、if6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:if
expr1?then?body1
elseif
expr2?then?body2
elseif...?else??bodyN?
Example:
if{$vbl==1}{puts"vblisone"}
if{$vbl==1}{puts"vblisone"}else{puts"vblisnotone"}
if{$vbl==1}{puts"vblisone"}elseif{$vbl==2}{puts"vblistwo"}else{puts"vblisnotoneortwo"}
if{$vbl==1||$vbl==2||$vbl==3}then{puts"vblisone,twoorthree"}注意:if和{之間一定要有空格,body的{一定要與if同行6-1、if6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:6-2、for6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:for
starttestnextbody
Example:
for{setx0}{$x<10}{incrx}{puts"xis$x“}
for{setx0}$x<10{incrx}{puts"xis$x"}注意:test必須用花括號(hào)括起來,推遲置換。6-2、for6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)6-3、while6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:while
testbody
Example:
setx0
while{$x<10}{puts"xis$x"incrx}注意:test必須用花括號(hào)括起來,推遲置換。6-3、while6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式6-4、foreach6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:foreach
varnamelistbody
foreach
varlist1list1?varlist2list2...?body
Example:
setvalues{13572468}foreachx$values{puts"$x}
setx{}
foreach{ij}{abcdef}{lappendx$j$i}
foreachi{abc}j{defg}{lappendx$i$j}
6-4、foreach6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令6-5、switch6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格式:switch?options?stringpatternbody?patternbody...?
switch?options?string{patternbody?patternbody...?}
Example:
switchxyz{a-b{expr{1}}c{expr{2}}default{expr{3}}}6-5、switch6、TCL的控制TCL腳本語(yǔ)言培訓(xùn)命令格7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)TCL支持過程的定義和調(diào)用,在TCL中,過程可以看作是用TCL腳本實(shí)現(xiàn)的命令,效果與TCL的固有命令相似。我們可以在任何時(shí)候使用proc命令定義自己的過程,TCL中的過程類似于C中的函數(shù)。過程的返回值是過程體中最后執(zhí)行的那條命令的返回值
proc命令用于創(chuàng)建一個(gè)TCL過程命令格式:proc
nameargsbodyExample:procprintArgumentsargs{foreacharg$args{puts$arg}}procmult{varName{multiplier2}}{upvar1$varNamevarsetvar[expr{$var*$multiplier}]}7-1、過程的定義7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)TCL支持過程的定義和調(diào)用7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)
TCL支持三種參數(shù)類型:無參數(shù)、缺省參數(shù)、可變參數(shù)Example:procadd{}{expr2+3}procadd{val1{val22}{val33}}{expr$val1+$val2+$val3}procadd{val1args}{setsum$val1foreachi$args{incrsum$i}return$sum}7-2、過程的參數(shù)7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)TCL支持三種參數(shù)類型:7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)對(duì)于在過程中定義的變量,因?yàn)樗鼈冎荒茉谶^程中被訪問,并且當(dāng)過程退出時(shí)會(huì)被自動(dòng)刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過程的內(nèi)部;全局變量的作用域則不包括所有過程的內(nèi)部。這一點(diǎn)和C語(yǔ)言有很大的不同.如果我們想在過程內(nèi)部引用一個(gè)全局變量的值,可以使用global命令Example:
seta100
procsample{x}{globalaincrareturn[expr$a+$x]}
7-3、局部變量與全局變量7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)對(duì)于在過程中定義的變量,因7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)upvar命令用于用戶在過程中對(duì)全局變量或其他過程中的局部變量進(jìn)行訪問命令格式:upvar?level?otherVarmyVar?otherVarmyVar...?
upvar命令的第一個(gè)參數(shù)otherVar是我們希望以引用方式訪問的參數(shù)的名字,第二個(gè)參數(shù)myVar是這個(gè)過程中的局部變量的名字,一旦使用了upvar命令把otherVar和myVar綁定,那么在過程中對(duì)局部變量myVar的讀寫就相當(dāng)于對(duì)這個(gè)過程的調(diào)用者中otherVar所代表的局部變量的讀寫。level參數(shù)表示:調(diào)用upvar命令的過程相對(duì)于我們希望引用的變量myVar在調(diào)用棧中相對(duì)位置Example:proctemp{arg}{upvar$argbsetb[expr$b+2]}
upvar2otherx;#訪問當(dāng)前過程的調(diào)用者的調(diào)用者中的otherupvar#0otherx;#訪問全局的變量other7-4、引用upvar7、TCL的過程TCL腳本語(yǔ)言培訓(xùn)upvar命令用于用戶在過8、TCL的字符串操作(一)TCL腳本語(yǔ)言培訓(xùn)string命令具有強(qiáng)大的操作字符串的功能,其中的option選項(xiàng)多達(dá)20個(gè)stringcompare?-nocase??-lengthint?string1string2把字符串string1和string2進(jìn)行比較,返回值為-1、0或1,分別對(duì)應(yīng)string1小于、等于或大于string2。如果有-length參數(shù),那么只比較前int個(gè)字符,如果int為負(fù)數(shù),那么這個(gè)參數(shù)被忽略。如果有-nocase參數(shù),那么比較時(shí)不區(qū)分大小寫。
stringequal?-nocase??-lengthint?string1
string2
把字符串string1和string2進(jìn)行比較,如果兩者相同,返回值為1,否則返回0。其他參數(shù)與stringcompare同。stringfirststring1
string2?startindex?在string2中從頭查找與string1匹配的字符序列,如果找到,那么就返回匹配的第一個(gè)字母所在的位置(0-based)。如果沒有找到,那么返回-1。如果給出了startindex變量,那么將從startindex處開始查找。8、TCL的字符串操作(一)TCL腳本語(yǔ)言培訓(xùn)string8、TCL的字符串操作(二)TCL腳本語(yǔ)言培訓(xùn)stringindexstring
charIndex
返回string中第charIndex個(gè)字符(0-based)。charIndex可以是下面的值:整數(shù)n:字符串中第n個(gè)字符(0-based)end:最后一個(gè)字符end-整數(shù)n:倒數(shù)第n個(gè)字符。stringindex"abcd"end-1返回字符'c'如果charIndex小于0,或者大于字符串string的長(zhǎng)度,那么返回空。stringlaststring1string2?startindex?參照stringfirst.唯一的區(qū)別是從后往前查找stringlengthstring
返回字符串string的長(zhǎng)度.stringmatch?-nocase?pattern
string
如果pattern匹配string,那么返回1,否則返回0.如果有-nocase參數(shù),那么就不區(qū)分大小寫.8、TCL的字符串操作(二)TCL腳本語(yǔ)言培訓(xùn)string8、TCL的字符串操作(三)TCL腳本語(yǔ)言培訓(xùn)stringrangestring
first
last返回字符串string中從第first個(gè)到第last個(gè)字符的子字符串(0-based)。如果first<0,那么first被看作0,如果last大于或等于字符串的長(zhǎng)度,那么last被看作end,如果first比last大,那么返回空。stringrepeatstring
count返回值為:重復(fù)了string字符串count次的字符串stringreplacestring
first
last?newstring?返回值為:從字符串string中刪除了第first到第last個(gè)字符(0-based)的字符串,如果給出了newstring變量,那么就用newstring替換從第first到第last個(gè)字符。如果first<0,那么first被看作0,如果last大于或等于字符串的長(zhǎng)度,那么last被看作end,如果first比last大或者大于字符串string的長(zhǎng)度或者last小于0,那么原封不動(dòng)的返回string
stringtolowerstring
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度企事業(yè)單位員工食堂改造與升級(jí)合同范本3篇
- 2024年度區(qū)塊鏈技術(shù)應(yīng)用債權(quán)債務(wù)協(xié)議書3篇
- 2025版生態(tài)農(nóng)業(yè)儲(chǔ)值卡銷售與農(nóng)產(chǎn)品溯源合作合同3篇
- 2024年精準(zhǔn)房地產(chǎn)開工程協(xié)議范本一
- 2025版月餅代工生產(chǎn)合同3篇
- 2025版科技園區(qū)空置房屋租賃及研發(fā)支持合同3篇
- 2025年智能交通樞紐安全監(jiān)控與客流分析合同
- 2024年跨區(qū)域水電站建設(shè)與電力購(gòu)銷合同
- 2024年中國(guó)氧代氨噻肟酸酯市場(chǎng)調(diào)查研究報(bào)告
- 2025版建筑模板購(gòu)銷及安裝施工合同3篇
- 公務(wù)員調(diào)任(轉(zhuǎn)任)審批表 - 陽(yáng)春人才網(wǎng)
- 土地利用動(dòng)態(tài)遙感監(jiān)測(cè)規(guī)程
- 大班音樂《歡樂頌》課件
- 2023年35kV集電線路直埋施工方案
- 《鋼結(jié)構(gòu)》期末考試/試題庫(kù)(含答案)要點(diǎn)-2
- 小學(xué)綜合實(shí)踐活動(dòng)案例,小學(xué)綜合實(shí)踐活動(dòng)案例
- 思政教師培訓(xùn)心得體會(huì)2021
- 零基礎(chǔ)的住宅和城市設(shè)計(jì)知到章節(jié)答案智慧樹2023年同濟(jì)大學(xué)
- 防止電力生產(chǎn)事故的-二十五項(xiàng)重點(diǎn)要求2023版
- 建辦號(hào)建筑工程安全防護(hù)、文明施工措施費(fèi)用及使用管理規(guī)定
- GB/T 30170-2013地理信息基于坐標(biāo)的空間參照
評(píng)論
0/150
提交評(píng)論