Tcl 語(yǔ)法
Tcl是一種很通用的腳本語(yǔ)言,它幾乎在所有的平臺(tái)上都可以釋運(yùn)行,其強(qiáng)大的功能和簡(jiǎn)單精妙的語(yǔ)法會(huì)使你感到由衷的喜悅,這片文章對(duì) Tcl有很好的描述和說明。如果你看起來很吃力,那是因?yàn)?Tcl與一般的語(yǔ)言有一些不同之處,剛開始可能有一些不理解,但很快就會(huì)掌握的。請(qǐng)堅(jiān)持一下,我能堅(jiān)持寫完,你至少也應(yīng)該堅(jiān)持讀一遍吧!
Tcl Overview
這篇文章里包含了幾乎 Tcl 的全部。文章的作者是Tcl的締造者John Ousterhout,對(duì)Tcl的詮釋非常清楚。
Introduction 簡(jiǎn)介
Tcl 代表 "tool command language" 發(fā)音為 "tickle." 。它實(shí)際上包含了兩個(gè)部分:一個(gè)語(yǔ)言和一個(gè)庫(kù)。
首先,Tcl是一種簡(jiǎn)單的腳本語(yǔ)言,主要使用于發(fā)布命令給一些互交程序如文本編輯器、調(diào)試器和shell。它有一個(gè)簡(jiǎn)單的語(yǔ)法和很強(qiáng)可擴(kuò)充性,Tcl可以創(chuàng)建新的過程以增強(qiáng)其內(nèi)建命令的能力。
其次,Tcl是一個(gè)庫(kù)包,可以被嵌入應(yīng)用程序,Tcl的庫(kù)包含了一個(gè)分析器、用于執(zhí)行內(nèi)建命令的例程和可以使你擴(kuò)充(定義新的過程)的庫(kù)函數(shù)。應(yīng)用程序可以產(chǎn)生Tcl命令并執(zhí)行,命令可以由用戶產(chǎn)生,也可以從用戶接口的一個(gè)輸入中讀?。ò粹o或菜單等)。但Tcl庫(kù)收到命令后將它分解并執(zhí)行內(nèi)建的命令,經(jīng)常會(huì)產(chǎn)生遞歸的調(diào)用。
應(yīng)用程序使用Tcl作為它的命令語(yǔ)言有三個(gè)好處:
1 Tcl提供了標(biāo)準(zhǔn)語(yǔ)法,一旦用戶掌握了Tcl就可以很容易的發(fā)布命令給基于Tcl的程序。
2 Tcl實(shí)現(xiàn)了很多的功能,使你的工作變得很方便。
3 TCl可作為程序間通信的接口。
Tcl Interpreters 解釋器
在Tcl的數(shù)據(jù)結(jié)構(gòu)中的核心是Tcl_Interp.一個(gè)解釋器包含了一套命令,一組變量和一些用于描述狀態(tài)的東西。每一個(gè) Tcl命令是在特定的Tcl_Interp中運(yùn)行的,基于Tcl的應(yīng)用程序可以同時(shí)擁有幾個(gè)Tcl_Interp。Tcl_Interp是一個(gè)輕量級(jí)的結(jié)構(gòu),可以快速的新建和刪除。
Tcl Data Types 數(shù)據(jù)類型
Tcl只支持一種數(shù)據(jù)結(jié)構(gòu):字符串(string)。所有的命令,命令的所有的參數(shù),命令的結(jié)果,所有的變量都是字符串。請(qǐng)牢記這一點(diǎn),所有的東西都是字符串。
然而字符串的實(shí)際解釋是依賴于上下文或命令的。它有三種形式:命令(command), 表達(dá)式(expresion)和表(list)。下面會(huì)討論細(xì)節(jié)。
Basic Command Syntax 基本語(yǔ)法
Tcl有類似于shell和lisp的語(yǔ)法,當(dāng)然也有許多的不同。一條Tcl的命令串包含了一條或多條命令用換行符或分號(hào)來隔開,而每一條命令包含了一個(gè)域(field)的集合,域使用空白分開的,第一個(gè)域是一個(gè)命令的名字,其它的是作為參數(shù)來傳給它。
例如:
set a 22 //相當(dāng)于C中的 a=22 a是一個(gè)變量這條命令分為三個(gè)域: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ù)作為字符串來傳遞,命令自己會(huì)按其所需來解釋的參數(shù)的。命令的名字必須被打全,但 Tcl解釋器找不到一同名的命令時(shí)會(huì)用 unknown命令
來代替。
在很多場(chǎng)合下,unknown 會(huì)在庫(kù)目錄中搜尋,找到一個(gè)的話,會(huì)自動(dòng)生成一個(gè)Tcl命令并調(diào)用它。unknown經(jīng)常完成縮略的命令名的執(zhí)行。但最好不要使用。
Comments 注釋
和shell很象,第一個(gè)字母是'#'的Tcl字符串是注釋。
Grouping arguments with double-quotes 用雙引號(hào)來集群參數(shù)用雙引號(hào)來集群參數(shù)的目的在于使用有空白的參數(shù)。
例如:
set a "this string contains whitespace"
如夠一個(gè)參數(shù)一雙引號(hào)來開始,該參數(shù)會(huì)一直到下一個(gè)雙引號(hào)才結(jié)束。其中可以有換行符和分號(hào)。
子替換是在正式運(yùn)行該調(diào)命令之前由分析器作的
Variable substitution with $ 用美元符進(jìn)行變量替換說白了就是引用該變量。
如:
set a hello
set b $a // b = "hello" 實(shí)際上傳給set命令的參數(shù)
//是b,"hello"
set c a // b = "a"
Command substitution with brackets 命令子替換(用方括號(hào))
例如:
set a [set b "hello"]
實(shí)現(xiàn)執(zhí)行 set b "hello" 并用其結(jié)果來替換源命令
中的方括號(hào)部分,產(chǎn)生一條新命令
set a "hello" //"hello" 為 set b "hello" 的返
//回值
最終的結(jié)果是b="hello" a="hello"
當(dāng)命令的一個(gè)子域以方括號(hào)開始以方括號(hào)結(jié)束,表示要進(jìn)行一個(gè)命令子替換。并執(zhí)行該子命令,用其結(jié)果來替換原命令中的方括號(hào)部分。方括號(hào)中的部分都被視為Tcl命令。
一個(gè)復(fù)雜一點(diǎn)的例子:
set a xyz[set b "abc"].[set c "def"]
//return xyzabcdef
Backslash substitution 轉(zhuǎn)移符替換
轉(zhuǎn)移符時(shí)間不可打印字符或由它數(shù)意義的字符插入進(jìn)來。這一概念與C語(yǔ)言中的一樣。
\b Backspace (0x8).
\f Form feed (0xc).
\n Newline (0xa).
\r Carriage-return (0xd).
\t Tab (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 用花擴(kuò)括號(hào)來集群參數(shù)
用花擴(kuò)括號(hào)來集群參數(shù)與用雙引號(hào)來集群參數(shù)的區(qū)別在于:用花擴(kuò)括號(hào)來集群參數(shù)其中的三種上述的子替換不被執(zhí)行。而且可以嵌套。
例如:
set a {xyz a {b c d}}//set收到倆個(gè)參數(shù) a 'xyz a {b
//c d}'
eval {
set a 22
set b 33
}//eval收到一個(gè)參數(shù) 'set a 22\nset b 33'
Command summary 命令綜述
1.一個(gè)命令就是一個(gè)字符串(string)。
2.命令是用換行符或分號(hào)來分隔的。
3.一個(gè)命令由許多的域組成。第一個(gè)于是命令名,其它的域作為參數(shù)來傳遞。
4.域通常是有空白(Tab橫向制表健 Space空格)來分開的。
5.雙引號(hào)可以使一個(gè)參數(shù)包括換行符或分號(hào)。三種子替換仍然發(fā)生。
6.花括號(hào)類似于雙引號(hào),只是不進(jìn)行三總體換。
7.系統(tǒng)只進(jìn)行一層子替換,機(jī)制替換的結(jié)果不會(huì)再去做子替換。而且子替換可以在任何一個(gè)域進(jìn)行。
8.如果第一個(gè)非控字符是`#', 這一行的所有東西都是注釋。
Expressions 表達(dá)式
對(duì)字符串的一種解釋是表達(dá)式。幾個(gè)命令將其參數(shù)按表達(dá)式處理,如:expr、for 和 if,并調(diào)用Tcl表達(dá)式處理器(Tcl_ExprLong,Tcl_ExprBoolean等)來處理它們。其中的運(yùn)算符與C語(yǔ)言的很相似。
!
邏輯非
* / % + -
<< >>
左移 右移 只能用于整數(shù)。
< > <= >= == !=
邏輯比較
& ^ |
位運(yùn)算 和 異或 或
&& ||
邏輯'和' '或'
x ? y : z
If-then-else 與C的一樣
Tcl 中的邏輯真為1,邏輯假為0。
一些例子:
5 / 4.0
5 / ( [string length "abcd"] + 0.0 )
---------------------- ---
計(jì)算字符串的長(zhǎng)度 轉(zhuǎn)化為浮點(diǎn)數(shù)來計(jì)算
"0x03" > "2"
"0y" < "0x12"
都返回 1
set a 1
expr $a+2
expr 1+2
都返回 3
Lists 列表
字符串的另一種解釋為列表。一個(gè)列表是類似于結(jié)果的一個(gè)字符串包含了用空白分開的很多域。例如 "Al Sue Anne John" 是一個(gè)有四個(gè)元素的例表,在列表中換行父被視為分隔符。
例如:
b c {d e {f g h}} 是一個(gè)有三個(gè)元素的列表 b 、c 和 {d e {f g h}}。
Tcl的命令 concat, foreach, lappend, lindex, linsert,list , llength, lrange,lreplace, lsearch, 和 lsort 可以使你對(duì)列表操作。
Regular expressions 正則表達(dá)式
Tcl 提供了兩個(gè)用于正則表達(dá)式的命令 regexp 和 regsub。
這里的正則表導(dǎo)師實(shí)際上是擴(kuò)展的正則表達(dá)式,與 egrep 相一致。
支持 ^ $ . + ? \> \< () | []
Command results 命令結(jié)果
每一條命令有倆個(gè)結(jié)果:一個(gè)退出值和一個(gè)字符串。退出值標(biāo)志著命令是否正確執(zhí)行,字符串給出附加信息。
有效的返回制定議在`tcl.h', 如下:
TCL_OK
命令正確執(zhí)行,字符串給出了命令的返回值。
TCL_ERROR
表示有一個(gè)錯(cuò)誤發(fā)生,字符串給出了錯(cuò)誤的描述。全局變量 errorInfo 包含了人類可讀的錯(cuò)誤描述,全局變量errorCode 機(jī)器使用的錯(cuò)誤信息。
TCL_RETURN
表示 return 命令被調(diào)用,當(dāng)前的命令(通常是一個(gè)函數(shù))必須立刻返回,字符串包含了返回值。
TCL_BREAK
表示break已經(jīng)被調(diào)用,最近的巡環(huán)必須立刻返回并跳出。字符串應(yīng)該是空的。
TCL_CONTINUE
表示continue已經(jīng)被調(diào)用,最近的巡環(huán)必須立刻返回不跳出。字符串應(yīng)該是空的。
Tcl編程者一般需要關(guān)心退出值。當(dāng)Tcl解釋器發(fā)現(xiàn)錯(cuò)誤發(fā)生后會(huì)立刻停止執(zhí)行。
Procedures 函數(shù)
Tcl 允許你通過proc命令來擴(kuò)充命令(定義新的命令),定義之后可以向其它的內(nèi)建命令一樣使用。
例如:
proc pf {str} {
puts $str
}
pf "hello world"
這里有一個(gè)初學(xué)者不注意的地方,上述的定義一定要寫成那樣子。而不能向下面那樣寫:
proc pf {str}
{
puts $str
}
因?yàn)閜roc實(shí)際上也只不過是一條命令,是一換行符或分號(hào)來結(jié)束的,用集群參數(shù)來傳遞函數(shù)體。proc的定義如下:
proc name args tclcommand
Variables: scalars and arrays 變量:標(biāo)量和向量(即數(shù)組)
向量就是數(shù)組,而標(biāo)量是沒有下表的變量。
我們用C來類比:
int i; // i 是標(biāo)量
int j[10]; // j 是向量
變量不需要定義,使用的時(shí)候會(huì)自動(dòng)的被創(chuàng)建。Tcl支持兩種
變量:標(biāo)量和向量
舉個(gè)例子來說明吧,
set i 100
set j(0) 10
set k(1,3) 20
i是標(biāo)量,j是向量。
引用的時(shí)候:
$i
$j(0)
$k(1,3)
Tcl簡(jiǎn)介(二):Tcl 內(nèi)建命令
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, 無(wú)論是否有錯(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ù)連起來作為命令語(yǔ)句來執(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
檢查名是否完全,有無(wú)錯(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
Tcl簡(jiǎn)介(三):Tcl 內(nèi)建命令
Tcl 名字空間
namespace
創(chuàng)建和操縱命令和變量的上下文(content)。
簡(jiǎn)介:
一個(gè)名字空間是一個(gè)命令和變量的集合,通過名字空間的封裝來
保證他們不會(huì)影響其它名字空間的變量和命令。 Tcl 總是維護(hù)了一
個(gè)全局名字空間 global namespace 包含了所有的全局變量和命令。
namespace eval允許你創(chuàng)建一個(gè)新的namespace。
例如:
namespace eval Counter {
namespace export Bump
variable num 0
proc Bump {} {
variable num//聲明局部變量
incr num
}
}
名字空間是動(dòng)態(tài)的,可變的。
例如:
namespace eval Counter {
variable num 0//初始化
proc Bump {} {
variable num
return [incr num]
}
}
//添加了一個(gè)過程
namespace eval Counter {
proc test {args} {
return $args
}
}
//刪除test
namespace eval Counter {
rename test ""
}
引用:
set Counter::num
//return 0
也可以用下面的方式添加:
proc Foo::Test {args} {return $args}
或在名字空間中移動(dòng):
rename Foo::Test Bar::Test