|
發(fā)信人: chenhao (努力學(xué)習(xí)), 信區(qū): Linux
標(biāo) 題: Tcl簡(jiǎn)介(二):Tcl 內(nèi)建命令 發(fā)信站: 北大未名站 (2000年11月24日00:47:29 星期五) , 轉(zhuǎn)信 Tcl簡(jiǎn)介(二):Tcl 內(nèi)建命令 作者:Bricks Tcl 內(nèi)建命令 Built-in commands 內(nèi)建的命令 Tcl提供了下面描述的內(nèi)建函數(shù)。 ... 表示參數(shù)不定 append varName value append varName value value value ... 將那一大堆value附加到varName后面。如果變量不存在,會(huì)新 建一個(gè)。 例子: set i "aaa" append i "bbb" "ccc" //i = aaabbbccc array subcommand arrayName array subcommand arrayName arg ... 這是一組用于向量操作的命令。第二個(gè)參數(shù)是子命令名。 假設(shè): set a(1) 1111 set a(2) 2222 set a(three) 3333 一下均以它為例子(tclsh在中運(yùn)行)。 array names arrayName 返回一個(gè)數(shù)組元素名字的列表。 tclsh>array names a 1 2 three array size arrayName 返回?cái)?shù)組的元素個(gè)數(shù)。 tclsh>array size a 3 下面是用于遍歷的命令 arrry startsearch arrayName 初始化一次遍歷,返回一個(gè)遍歷標(biāo)示(searchId)在下面的命令 是中使用。 array nextelement arrayName searchId 返回下一個(gè)數(shù)組中的元素。如果沒有返回一個(gè)空串。 array anymore arrayName searchId 返回 1 表示還有更多的元素。0 表示沒有了。 array donesearch arrayName searchId 結(jié)束該次遍歷。 array nextelement arrayName searchId 返回下一個(gè)元素。 tclsh>array startsearch a s-1-a tclsh>array nextelement a s-1-a 1111 tclsh>array nextelement a s-1-a 2222 tclsh>array anymore a s-1-a 1 tclsh?array nextelement a s-1-a 3333 tclsh>array donesearch a s-1-a 注意可以同時(shí)并發(fā)多個(gè)遍歷。 break 跳出最近的循環(huán)。 case string in patList body ... case string patList body ... case string in {patList body ...} case string {patList body ...} 分支跳轉(zhuǎn)。 例如: case abc in {a b} {puts 1} default {puts 2} a* {puts 3} return 3. case a in { {a b} {format 1} default {format 2} a* {format 3} } returns 1. case xyz { {a b} {format 1} default {format 2} a* {format 3} } returns 2. 注意default不可以放在第一位。支持shell文件名風(fēng)格的匹配 符。 catch command catch command varName 用于阻止由于錯(cuò)誤而導(dǎo)致中斷執(zhí)行。執(zhí)行command, 每次都返 回TCL_OK, 無論是否有錯(cuò)誤發(fā)生。如有錯(cuò)誤發(fā)生返回1 ,反之返回0 。如果給了varName這被置為錯(cuò)誤信息。注意varName是已經(jīng)存在的 變量。 cd cd dirName 轉(zhuǎn)換當(dāng)前工作目錄。如dirName未給出則轉(zhuǎn)入home目錄。 close fileId 關(guān)閉文件描述符。 concat arg ... 將參數(shù)連接產(chǎn)生一個(gè)表。 concat a b {c d e} {f {g h}} return `a b c d e f {g h}' continue 結(jié)束該次循環(huán)并繼續(xù)循環(huán)。 eof fileId 如fileId以結(jié)束 返回1,反之返回 0。 error message error message info error message info code 返回一個(gè)錯(cuò)誤,引起解釋器停止運(yùn)行。info用于初始化全局變 量errorInfo。code被付給errorCode。 eval arg ... 將所有的參數(shù)連起來作為命令語句來執(zhí)行。 exec arg ... 仿佛是在shell下執(zhí)行一條命令。 exec ls --color exec cat /etc/passwd > /tmp/a exit exit returnCode 中斷執(zhí)行。 expr arg 處理表達(dá)式。 set a [expr 1+1] //a=2 file subcommand name 一組用于文件處理的命令。 file subcommand name arg ... file atime name 返回文件的最近存取時(shí)間。 file dirname name 返回name所描述的文件名的目錄部分。 file executable name 返回文件是否可被執(zhí)行。 file exists name 返回1 表示文件存在,0 表示文件不存在。 file extension name 返回文件的擴(kuò)展名。 file isdirectory name 判斷是否為目錄。 file isfile name 判斷是否為文件。 file lstat name varName 以數(shù)組形式返回。執(zhí)行l(wèi)stat系統(tǒng)函數(shù)。存儲(chǔ)在varName。 file mtime name 文件的最近修改時(shí)間。 file owned name 判斷文件是否屬于你。 file readable name 判斷文件是否可讀。 file readlink name 都出符號(hào)連接的真正的文件名。 file rootname name 返回不包括最后一個(gè)點(diǎn)的字符串。 file size name 返回文件的大小。 file stat name varName 調(diào)用stat內(nèi)和調(diào)用,以數(shù)組形式存在varName中。 file tail name 返回最后一個(gè)斜線以后的部分。 file type name 返回文件類型file, directory, characterSpecial, blockSpecial, fifo, link, 或 socket。 file writable name 判斷文件是否可寫。 flush fileId 立即處理由fileId描述的文件緩沖區(qū)。 for start test next body for循環(huán)。同C總的一樣。 for {set i 1} {$i < 10} {incr i} {puts $i} foreach varname list body 類似于C Shell總的foreach或bash中的for..in... format formatString format formatString arg ... 格式化輸出,類似于C中的sprintf。 set a [format "%s %d" hello 100] //a="hello 100" gets fileId gets fileId varName 從文件中讀出一行。 set f [open /etc/passwd r] gets $f glob filename ... glob -nocomplain filename ... 使用C Shell風(fēng)格的文件名通配規(guī)則,對(duì)filename進(jìn)行擴(kuò)展。 ls /tmp a b c tclsh>glob /tmp/* a b c 當(dāng)加上參數(shù) -nocomplain 時(shí),如文件列表為空則發(fā)生一個(gè)錯(cuò) 誤。 global varname ... 定義全局變量。 if test trueBody if test trueBody falseBody if test then trueBody if test then trueBody else falseBody 條件判斷,是在沒什么說的。 incr varName incr varName increment 如果沒有incremnet,將varName加一,反之將varName加 上increment。 set i 10 incr i //i=11 incr i 10 //i=21 info subcommand info subcommand arg ... 取得當(dāng)前的Tcl解釋器的狀態(tài)信息。 info args procname 返回由procname指定的命令(你自己創(chuàng)建的)的參數(shù)列表。 如: proc ff { a b c } {puts haha} info args ff //return "a b c" info body procname 返回由procname指定的命令(你自己創(chuàng)建的)的函數(shù)體。 如: proc ff { a b c } {puts haha} info body ff //return "puts haha" info cmdcount 返回當(dāng)前的解釋器已經(jīng)執(zhí)行的命令的個(gè)數(shù)。 info commands info commands pattern 如果不給出模式,返回所有的命令的列表,內(nèi)建和自建的。 模式是用C Shell匹配風(fēng)格寫成的。 info complete command 檢查名是否完全,有無錯(cuò)誤。 info default procname arg varname procname的參數(shù)arg,是否有缺省值。 info exists varName 判斷是否存在該變量。 info globals info globals pattern 返回全局變量的列表,模式同樣是用C Shell風(fēng)格寫成的。 info hostname 返回主機(jī)名。 info level info level number 如果不給參數(shù)number則返回當(dāng)前的在棧中的絕對(duì)位置,參 見uplevel中的描述。如加了參數(shù)number,則返回一個(gè)列表包 含了在該level上的命令名和參數(shù)。 info library 返回標(biāo)準(zhǔn)的Tcl腳本的可的路徑。實(shí)際上是存在變量 tcl_library中。 info locals info locals pattern 返回locale列表。 info procs info procs pattern 返回所有的過程的列表。 info script 返回最里面的腳本(用 source 來執(zhí)行)的文件名。 info tclversion 返回Tcl的版本號(hào)。 info vars info vars pattern 返回當(dāng)前可見的變量名的列表。 下面是一些用于列表的命令,范圍可以是end。 join list join list joinString 將列表的內(nèi)容連成一個(gè)字符串。 lappend varName value ... 將value加入列表varName中。 lindex list index 將list視為一個(gè)列表,返回其中第index個(gè)。列表中的第一個(gè) 元素下標(biāo)是0。 lindex "000 111 222" 1 111 linsert list index element ... 在列表中的index前插入element。 list arg ... 將所有的參數(shù)發(fā)在一起產(chǎn)生一個(gè)列表。 list friday [exec ls] [exec cat /etc/passwd] llength list 返回列表中元素的個(gè)數(shù)。 set l [list sdfj sdfjhsdf sdkfj] llength $l //return 3 lrange list first last 返回列表中從frist到last之間的所有元素。 set l [list 000 111 222 333 444 555] lrange $l 3 end //return 333 444 555 lreplace list first last lreplace list first last element ... 替換列表中的從first到last的元素,用element。 set l [list 000 111 222 333 444 555] lreplace $l 1 2 dklfj sdfsdf dsfjh jdsf 000 dklfj sdfsdf dsfjh jdsf 333 444 555 lsearch -mode list pattern 在列表中搜索pattern,成功返回序號(hào),找不到返回-1。 -mode : -exact 精確 -glob shell的通配符 -regexp 正則表達(dá)式 lsearch "111 222 333 444" 111 //return 0 lsearch "111 222 333 444" uwe //return 1 lsort -mode list 排列列表。 -mode : -ascii -dictionary 與acsii類似,只是不區(qū)分大小寫 -integer 轉(zhuǎn)化為整數(shù)再比較 -real 轉(zhuǎn)化為浮點(diǎn)數(shù)再比較 -command command 執(zhí)行command來做比較 open fileName open fileName access 打開文件,返回一個(gè)文件描述符。 access r w a r+ w+ a+ 定義與C中相同。如文件名的第一個(gè)字符為|表示一管道的形式 來打開。 set f [open |more w] set f [open /etc/pass r] proc name args body 創(chuàng)建一個(gè)新的過程,可以替代任何存在的過程或命令。 proc wf {file str} { puts -nonewline $file str flush $file } set f [open /tmp/a w] wf $f "first line\n" wf $f "second line\n" 在函數(shù)末尾可用 return 來返回值。 puts -nonewline fileId string 向fileId中寫入string,如果不加上 -nonewline 則自動(dòng)產(chǎn) 生一個(gè)換行符。 pwd 返回當(dāng)前目錄。 read fileId read fileId numBytes 從fileId中讀取numBytes個(gè)字節(jié)。 regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...? 執(zhí)行正則表達(dá)式的匹配。 switches? -nocase 不區(qū)分大小寫 -indices 返回匹配區(qū)間 如: regexp ^abc abcjsdfh //return 1 regexp ^abc abcjsdfh a //return 1 puts $a //return abc regexp -indices ^abc abcsdfjkhsdf a //return 1 puts $a //return "0 2" regsub ?switchs? exp string subSpec varName 執(zhí)行正則表達(dá)式的替換,用subSpec的內(nèi)容替換string中匹配exp 的部分。 switchs? -all 將所有匹配的部分替換,缺省子替換第一 個(gè),返回值為替換的個(gè)數(shù)。 -nocase 不區(qū)分大小寫。 如: regsub abc abcabcbac eee b //return 1 puts $b //return "eeeabcabc" regsub -all abc abcabcabc eee b //return 3 puts $b //return "eeeeeeeee" return 立即從當(dāng)前命令中返回。 proc ff {} { return friday } set a [ff] //a = "friday" scan string `format' varname ... 從string中安format來讀取值到varname。 seek fileId offset ?origin? 移動(dòng)文件指針。 origin: start current end offset從哪里開始算起。 set varname ?value? 設(shè)置varname用value,或返回varname的值。如果不是在一 個(gè)proc命令中則生成一個(gè)全局變量。 source fileName 從filename中讀出內(nèi)容傳給Tcl解釋起來執(zhí)行。 split string ?splitChars? 將string分裂成列表。缺省以空白為分隔符,也可通 過splitChars來設(shè)定分隔符 string subcommand arg ... 用于字符串的命令。 string compare string1 string2 執(zhí)行字符串的比較,按 C strcmp 的方式。返回 -1, 0, or 1。 string first string1 string2 在string1種查找string2的定義次出現(xiàn)的位置。未找到返回-1。 string length string 返回字符串string的長(zhǎng)度。 string match pattern string 判斷string是否能匹配pattern。pattern是以shell文件名的 統(tǒng)配格式來給出。 string range string first last 返回字符串string中從first到last之間的內(nèi)容。 string tolower string 將string轉(zhuǎn)換為小寫。 string toupper string 將string轉(zhuǎn)換為大寫。 string trim string 將string的左右空白去掉。 string trimleft string 將string的左空白去掉。 string trimright string 將string的右空白去掉。 tell fileId 返回fileId的文件指針位置。 time command 執(zhí)行命令,并計(jì)算所消耗的時(shí)間。 time "ls --color" some file name 503 microseconds per iteration trace subcommand trace subcommand arg ... 監(jiān)視變量的存儲(chǔ)。子命令定義了不少,但目前只實(shí)現(xiàn)了 virable。 trace variable name ops command name 為變量的名字。 ops 為要監(jiān)視的操作。 r 讀 w 寫 u unset command 條件滿足時(shí)執(zhí)行的命令。 以三個(gè)參數(shù)來執(zhí)行 name1 name2 ops name1時(shí)變量的名字。當(dāng)name1為矢量時(shí),name2為下標(biāo),ops 為執(zhí)行的操作。 例如: proc ff {name1 name2 op} { puts [format "%s %s %s" name1 name2 op] } set a hhh trace variable a r {ff} puts $a //return "a r\nhhh" unknown cmdName unknown 并不是 Tcl 的一部分,當(dāng) Tcl 發(fā)現(xiàn)一條不認(rèn)識(shí)的命 令時(shí)會(huì)看看是否存在 unknown命令,如果有,則調(diào)用它,沒有則出 錯(cuò)。 如: #!/usr/bin/tclsh proc unknown {cwd args} { puts $cwd puts $args } //下面是一條錯(cuò)誤命令 sdfdf sdf sdkhf sdjkfhkasdf jksdhfk //return "sdfdf sdf sdkhf sdjkfhkasdf jksdhfk" unset name ... 刪除一個(gè)或多個(gè)變量(標(biāo)量或矢量)。 uplevel command ... 將起參數(shù)連接起來(象是在concat中)。最后在由level所指 定的上下文中來執(zhí)行。如果level是一個(gè)整數(shù),給出了在棧中的距 離(是跳到其它的命令環(huán)境中來執(zhí)行)。 缺省為1(即上一層)。 如: #!/usr/bin/tcl proc ff {} { set a "ff" //設(shè)置了局部的a ------------------------- } set a "global" ff puts $a //return "global" 再看下一個(gè): #!/usr/bin/tcl proc ff {} { uplevel set a "ff" //改變上一級(jí)棧中的a ------------------------------------- } set a global ff puts $a //return "ff" 如果level是以#開頭后接一個(gè)整數(shù),則level指出了在棧中的 絕對(duì)位置。如#0表示了頂層(top-level)。 a b c 分別為三個(gè)命令,下面是它們之間的調(diào)用關(guān)系, top-level -> a -> b -> c -> uplevel level 絕對(duì)位置: 0 1 2 3 當(dāng)level為 1 或 #2 都是在 b 的環(huán)境中來執(zhí)行。 3 或 #0 都是在 top-level 的環(huán)境中來執(zhí)行。 upvar ?level? otherVar myVar ?otherVar myVar ...? 在不同的棧中為變量建立連接。這里的level與uplevel中 的level是同樣風(fēng)格的。 例如: #!/usr/bin/tcl proc ff {name } { upvar $name x set x "ff" } set a "global" ff a puts $a //return "ff" while test body 舉個(gè)例子吧: set x 0 while {$x<10} { puts "x is $x" incr x } Built-in variables 內(nèi)建的變量 下名的全局變量是由 Tcl library 自動(dòng)來管理的。一般是只 讀的。 env 環(huán)境變量數(shù)組。 如: puts $env(PATH) // return /bin:/usr/bin:/usr/X11R6/bin errorCode 當(dāng)錯(cuò)誤發(fā)生時(shí)保存了一些錯(cuò)誤信息。用下列格式來存儲(chǔ): CHILDKILLED pid sigName msg 當(dāng)由于一個(gè)信號(hào)而被終止時(shí)的信息。 CHILDSTATUS pid code 當(dāng)一個(gè)子程序以非0值退出時(shí)的格式。 CHILDSUSP pid sigName msg 當(dāng)一個(gè)子程序由于一個(gè)信號(hào)而被終止時(shí)的格式。 NONE 錯(cuò)誤沒有附加信息。 UNIX errName msg 當(dāng)一個(gè)內(nèi)核調(diào)用發(fā)生錯(cuò)誤時(shí)使用的格式。 errorInfo 包含了一行或多行的信息,描述了錯(cuò)誤發(fā)生處的程序和信息。 原文的作者也是Tcl的締造者 John Ousterhout (`ouster@sprite.berkeley.edu')寫于伯克利分校。 Tcl簡(jiǎn)介(三):Tcl 內(nèi)建命令 本文章版權(quán)屬Bricks with GNU&LINUX所有。 -- ※ 來源:.北大未名站 bbs.pku.edu.cn [FROM: 162.105.45.129] |
|
|