TCL语法.docx

上传人:b****3 文档编号:6545336 上传时间:2023-05-10 格式:DOCX 页数:27 大小:27.25KB
下载 相关 举报
TCL语法.docx_第1页
第1页 / 共27页
TCL语法.docx_第2页
第2页 / 共27页
TCL语法.docx_第3页
第3页 / 共27页
TCL语法.docx_第4页
第4页 / 共27页
TCL语法.docx_第5页
第5页 / 共27页
TCL语法.docx_第6页
第6页 / 共27页
TCL语法.docx_第7页
第7页 / 共27页
TCL语法.docx_第8页
第8页 / 共27页
TCL语法.docx_第9页
第9页 / 共27页
TCL语法.docx_第10页
第10页 / 共27页
TCL语法.docx_第11页
第11页 / 共27页
TCL语法.docx_第12页
第12页 / 共27页
TCL语法.docx_第13页
第13页 / 共27页
TCL语法.docx_第14页
第14页 / 共27页
TCL语法.docx_第15页
第15页 / 共27页
TCL语法.docx_第16页
第16页 / 共27页
TCL语法.docx_第17页
第17页 / 共27页
TCL语法.docx_第18页
第18页 / 共27页
TCL语法.docx_第19页
第19页 / 共27页
TCL语法.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

TCL语法.docx

《TCL语法.docx》由会员分享,可在线阅读,更多相关《TCL语法.docx(27页珍藏版)》请在冰点文库上搜索。

TCL语法.docx

TCL语法

Tcl简介

(一):

Tcl语法

Tcl语法

Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦,这片文章对Tcl有很好的描述和说明。

极具可读性,我并不是原封不动的翻译而是加上了一些自己的体会和例子,如有错误请指正。

如果你看起来很吃力,那是因为Tcl与一般的语言有一些不同之处,刚开始可能有一些不理解,但很快就会掌握的。

请坚持一下,我能坚持写完,你至少也应该坚持读一遍吧!

TclOverview

这篇文章里包含了几乎Tcl的全部。

文章的作者是Tcl的缔造者JohnOusterhout,对Tcl的诠释非常清楚。

Introduction简介

Tcl代表"toolcommandlanguage"发音为"tickle."。

它实际上包含了两个部分:

一个语言和一个库。

首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。

它有一个简单的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。

其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的过程)的库函数。

应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。

但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。

/*现在不理解没关系,请往下看*/

应用程序使用Tcl作为它的命令语言有三个好处:

1Tcl提供了标准语法,一旦用户掌握了Tcl就可以很容易的发布命令给基于Tcl的程序。

2Tcl实现了很多的功能,使你的工作变得很方便。

3TCl可作为程序间通信的接口。

TclInterpreters解释器

在Tcl的数据结构中的核心是Tcl_Interp.一个解释器包含了一套命令,一组变量和一些用于描述状态的东西。

每一个Tcl命令是在特定的Tcl_Interp中运行的,基于Tcl的应用程序可以同时拥有几个Tcl_Interp。

Tcl_Interp是一个轻量级的结构,可以快速的新建和删除。

TclDataTypes数据类型

Tcl只支持一种数据结构:

字符串(string)。

所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。

请牢记这一点,所有的东西都是字符串。

然而字符串的实际解释是依赖于上下文或命令的。

它有三种形式:

命令(command),表达式(expresion)和表(list)。

下面会讨论细节。

BasicCommandSyntax基本语法

Tcl有类似于shell和lisp的语法,当然也有许多的不同。

一条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个域(field)的集合,域使用空白分开的,第一个域是一个命令的名字,其它的是作为参数来传给它。

例如:

seta22//相当于C中的a=22a是一个变量这条命令分为三个域:

1:

set2:

a3:

22

set使用于设置变量的值的命令,a、20作为参数来传给它,a使它要操作的变量名,22是要付给的a值。

Tcl的命令名可以使内建的命令也可以是用户建的新命令,在应用程序中用函数Tcl_CreateCommand来创建。

所有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。

命令的名字必须被打全,但Tcl解释器找不到一同名的命令时会用unknown命令

来代替。

在很多场合下,unknown会在库目录中搜寻,找到一个的话,会自动生成一个Tcl命令并调用它。

unknown经常完成缩略的命令名的执行。

但最好不要使用。

Comments注释

和shell很象,第一个字母是'#'的Tcl字符串是注释。

Groupingargumentswithdouble-quotes用双引号来集群参数用双引号来集群参数的目的在于使用有空白的参数。

例如:

seta"thisstringcontainswhitespace"

如够一个参数一双引号来开始,该参数会一直到下一个双引号才结束。

其中可以有换行符和分号。

子替换是在正式运行该调命令之前由分析器作的

Variablesubstitutionwith$用美元符进行变量替换说白了就是引用该变量。

如:

setahello

setb$a//b="hello"实际上传给set命令的参数

//是b,"hello"

setca//b="a"

Commandsubstitutionwithbrackets命令子替换(用方括号)

例如:

seta[setb"hello"]

实现执行setb"hello"并用其结果来替换源命令

中的方括号部分,产生一条新命令

seta"hello"//"hello"为setb"hello"的返

 //回值

最终的结果是b="hello"a="hello"

当命令的一个子域以方括号开始以方括号结束,表示要进行一个命令子替换。

并执行该子命令,用其结果来替换原命令中的方括号部分。

方括号中的部分都被视为Tcl命令。

一个复杂一点的例子:

setaxyz[setb"abc"].[setc"def"]

//returnxyzabcdef

Backslashsubstitution转移符替换

转移符时间不可打印字符或由它数意义的字符插入进来。

这一概念与C语言中的一样。

\bBackspace(0x8).

\fFormfeed(0xc).

\nNewline(0xa).

\rCarriage-return(0xd).

\tTab(0x9).

\vVerticaltab(0xb).

\{Leftbrace(`{').

\}Rightbrace(`}').

\[Openbracket(`[').

\]Closebracket(`]').

\$Dollarsign(`$').

\spSpace(`'):

doesnotterminateargument.

\;Semicolon:

doesnotterminatecommand.

\"Double-quote.

Groupingargumentswithbraces用花扩括号来集群参数

用花扩括号来集群参数与用双引号来集群参数的区别在于:

用花扩括号来集群参数其中的三种上述的子替换不被执行。

而且可以嵌套。

例如:

seta{xyza{bcd}}//set收到俩个参数a'xyza{b

//cd}'

eval{

seta22

setb33

}//eval收到一个参数'seta22\nsetb33'

 

Commandsummary命令综述

1.一个命令就是一个字符串(string)。

2.命令是用换行符或分号来分隔的。

3.一个命令由许多的域组成。

第一个于是命令名,其它的域作为参数来传递。

4.域通常是有空白(Tab横向制表健Space空格)来分开的。

5.双引号可以使一个参数包括换行符或分号。

三种子替换仍然发生。

6.花括号类似于双引号,只是不进行三总体换。

7.系统只进行一层子替换,机制替换的结果不会再去做子替换。

而且子替换可以在任何一个域进行。

8.如果第一个非控字符是`#',这一行的所有东西都是注释。

Expressions表达式

对字符串的一种解释是表达式。

几个命令将其参数按表达式处理,如:

expr、for和if,并调用Tcl表达式处理器(Tcl_ExprLong,Tcl_ExprBoolean等)来处理它们。

其中的运算符与C语言的很相似。

!

逻辑非

*/%+-

<<>>

左移右移只能用于整数。

<><=>===!

=

逻辑比较

&^|

位运算和异或或

&&||

逻辑'和''或'

x?

y:

z

If-then-else与C的一样

Tcl中的逻辑真为1,逻辑假为0。

一些例子:

5/4.0

5/([stringlength"abcd"]+0.0)

-------------------------

计算字符串的长度转化为浮点数来计算

"0x03">"2"

"0y"<"0x12"

都返回1

seta1

expr$a+2

expr1+2

都返回3

Lists列表

字符串的另一种解释为列表。

一个列表是类似于结果的一个字符串包含了用空白分开的很多域。

例如"AlSueAnneJohn"是一个有四个元素的例表,在列表中换行父被视为分隔符。

例如:

bc{de{fgh}}是一个有三个元素的列表b、c和{de{fgh}}。

Tcl的命令concat,foreach,lappend,lindex,linsert,list,llength,lrange,lreplace,lsearch,和lsort可以使你对列表操作。

Regularexpressions正则表达式

Tcl提供了两个用于正则表达式的命令regexp和regsub。

这里的正则表导师实际上是扩展的正则表达式,与egrep相一致。

支持^$.+?

\>\<()|[]

Commandresults命令结果

每一条命令有俩个结果:

一个退出值和一个字符串。

退出值标志着命令是否正确执行,字符串给出附加信息。

有效的返回制定议在`tcl.h',如下:

TCL_OK

命令正确执行,字符串给出了命令的返回值。

TCL_ERROR

表示有一个错误发生,字符串给出了错误的描述。

全局变量errorInfo包含了人类可读的错误描述,全局变量errorCode机器使用的错误信息。

TCL_RETURN

表示return命令被调用,当前的命令(通常是一个函数)必须立刻返回,字符串包含了返回值。

TCL_BREAK

表示break已经被调用,最近的巡环必须立刻返回并跳出。

字符串应该是空的。

TCL_CONTINUE

表示continue已经被调用,最近的巡环必须立刻返回不跳出。

字符串应该是空的。

Tcl编程者一般需要关心退出值。

当Tcl解释器发现错误发生后会立刻停止执行。

Procedures函数

Tcl允许你通过proc命令来扩充命令(定义新的命令),定义之后可以向其它的内建命令一样使用。

例如:

procpf{str}{

puts$str

}

pf"helloworld"

这里有一个初学者不注意的地方,上述的定义一定要写成那样子。

而不能向下面那样写:

procpf{str}

{

puts$str

}

因为proc实际上也只不过是一条命令,是一换行符或分号来结束的,用集群参数来传递函数体。

proc的定义如下:

procnameargstclcommand

Variables:

scalarsandarrays变量:

标量和向量(即数组)

向量就是数组,而标量是没有下表的变量。

我们用C来类比:

inti;//i是标量

intj[10];//j是向量

变量不需要定义,使用的时候会自动的被创建。

Tcl支持两种

变量:

标量和向量

举个例子来说明吧,

seti100

setj(0)10

setk(1,3)20

i是标量,j是向量。

引用的时候:

$i

$j(0)

$k(1,3)

Tcl简介

(二):

Tcl内建命令

Tcl内建命令

Built-incommands内建的命令

Tcl提供了下面描述的内建函数。

...表示参数不定

appendvarNamevalue

appendvarNamevaluevaluevalue...

将那一大堆value附加到varName后面。

如果变量不存在,会新

建一个。

例子:

seti"aaa"

appendi"bbb""ccc"

//i=aaabbbccc

 

arraysubcommandarrayName

arraysubcommandarrayNamearg...

这是一组用于向量操作的命令。

第二个参数是子命令名。

假设:

seta

(1)1111

seta

(2)2222

seta(three)3333

一下均以它为例子(tclsh在中运行)。

arraynamesarrayName

返回一个数组元素名字的列表。

tclsh>arraynamesa

12three

arraysizearrayName

返回数组的元素个数。

tclsh>arraysizea

3

下面是用于遍历的命令

arrrystartsearcharrayName

初始化一次遍历,返回一个遍历标示(searchId)在下面的命令

是中使用。

arraynextelementarrayNamesearchId

返回下一个数组中的元素。

如果没有返回一个空串。

arrayanymorearrayNamesearchId

返回1表示还有更多的元素。

0表示没有了。

arraydonesearcharrayNamesearchId

结束该次遍历。

arraynextelementarrayNamesearchId

返回下一个元素。

tclsh>arraystartsearcha

s-1-a

tclsh>arraynextelementas-1-a

1111

tclsh>arraynextelementas-1-a

2222

tclsh>arrayanymoreas-1-a

1

tclsh?

arraynextelementas-1-a

3333

tclsh>arraydonesearchas-1-a

注意可以同时并发多个遍历。

break

跳出最近的循环。

casestringinpatListbody...

casestringpatListbody...

casestringin{patListbody...}

casestring{patListbody...}

分支跳转。

例如:

caseabcin{ab}{puts1}default{puts2}a*{puts3}

return3.

caseain{

{ab}{format1}

default{format2}

a*{format3}

}

returns1.

casexyz{

{ab}

{format1}

default

{format2}

a*

{format3}

}

returns2.

注意default不可以放在第一位。

支持shell文件名风格的匹配

符。

catchcommand

catchcommandvarName

用于阻止由于错误而导致中断执行。

执行command,每次都返

回TCL_OK,无论是否有错误发生。

如有错误发生返回1,反之返回0

如果给了varName这被置为错误信息。

注意varName是已经存在的

变量。

cd

cddirName

转换当前工作目录。

如dirName未给出则转入home目录。

closefileId

关闭文件描述符。

concatarg...

将参数连接产生一个表。

concatab{cde}{f{gh}}

return`abcdef{gh}'

continue

结束该次循环并继续循环。

eoffileId

如fileId以结束返回1,反之返回0。

errormessage

errormessageinfo

errormessageinfocode

返回一个错误,引起解释器停止运行。

info用于初始化全局变

量errorInfo。

code被付给errorCode。

evalarg...

将所有的参数连起来作为命令语句来执行。

execarg...

仿佛是在shell下执行一条命令。

execls--color

execcat/etc/passwd>/tmp/a

exit

exitreturnCode

中断执行。

exprarg

处理表达式。

seta[expr1+1]

//a=2

filesubcommandname

一组用于文件处理的命令。

filesubcommandnamearg...

fileatimename

返回文件的最近存取时间。

filedirnamename

返回name所描述的文件名的目录部分。

fileexecutablename

返回文件是否可被执行。

fileexistsname

返回1表示文件存在,0表示文件不存在。

fileextensionname

返回文件的扩展名。

fileisdirectoryname

判断是否为目录。

fileisfilename

判断是否为文件。

filelstatnamevarName

以数组形式返回。

执行lstat系统函数。

存储在varName。

filemtimename

文件的最近修改时间。

fileownedname

判断文件是否属于你。

filereadablename

判断文件是否可读。

filereadlinkname

都出符号连接的真正的文件名。

filerootnamename

返回不包括最后一个点的字符串。

filesizename

返回文件的大小。

filestatnamevarName

调用stat内和调用,以数组形式存在varName中。

filetailname

返回最后一个斜线以后的部分。

filetypename

返回文件类型file,directory,characterSpecial,

blockSpecial,fifo,link,或

socket。

filewritablename

判断文件是否可写。

flushfileId

立即处理由fileId描述的文件缓冲区。

forstarttestnextbody

for循环。

同C总的一样。

for{seti1}{$i<10}{incri}{puts$i}

foreachvarnamelistbody

类似于CShell总的foreach或bash中的for..in...

formatformatString

formatformatStringarg...

格式化输出,类似于C中的sprintf。

seta[format"%s%d"hello100]

//a="hello100"

getsfileId

getsfileIdvarName

从文件中读出一行。

setf[open/etc/passwdr]

gets$f

globfilename...

glob-nocomplainfilename...

使用CShell风格的文件名通配规则,对filename进行扩展。

ls/tmp

abc

tclsh>glob/tmp/*

abc

当加上参数-nocomplain时,如文件列表为空则发生一个错

误。

globalvarname...

定义全局变量。

iftesttrueBody

iftesttrueBodyfalseBody

iftestthentrueBody

iftestthentrueBodyelsefalseBody

条件判断,是在没什么说的。

incrvarName

incrvarNameincrement

如果没有incremnet,将varName加一,反之将varName加

上increment。

seti10

incri

//i=11

incri10

//i=21

infosubcommand

infosubcommandarg...

取得当前的Tcl解释器的状态信息。

infoargsprocname

返回由procname指定的命令(你自己创建的)的参数列表。

如:

procff{abc}{putshaha}

infoargsff

//return"abc" 

infobodyprocname

返回由procname指定的命令(你自己创建的)的函数体。

如:

procff{abc}{putshaha}

infobodyff

//return"putshaha" 

infocmdcount

返回当前的解释器已经执行的命令的个数。

infocommands

infocommandspattern

如果不给出模式,返回所有的命令的列表,内建和自建的。

模式是用CShell匹配风格写成的。

infocompletecommand

检查名是否完全,有无错误。

infodefaultprocnameargvarname

procname的参数arg,是否有缺省值。

infoexistsvarName

判断是否存在该变量。

infoglobals

infoglobalspattern

返回全局变量的列表,模式同样是用CShell风格写成的。

infohostname

返回主机名。

infolevel

infolevelnumber

如果不给参数number则返回当前的在栈中的绝对位置,参

见uplevel中的描述。

如加了参数number,则返回一个列表包

含了在该level上的命令名和参数。

infolibrary

返回标准的Tcl脚本的可的路径。

实际上是存在变量

tcl_library中。

infolocals

infolocalspattern

返回locale列表。

infoprocs

infoprocspattern

返回所有的过程的列表。

infoscript

返回最里面的脚本(用source来执行)的文件名。

infotclversion

返回Tcl的版本号。

infovars

infovarspattern

返回当前可见的变量名的列表。

下面是一些用于列表的命令,范围可以是end。

joinlist

joinlistjoinString

将列表的内容连成一个字符串。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2