目录
过程
• TCL支持过程的定义和调用,在TCL中,过程可以看作是用TCL脚本实现的命令,效果与TCL的固有命令相似。
TCL中过程是由proc命令产生的:
proc add {x y } {expr $x+$y}
proc命令的第一参数是你要定义的过程名字,第二个参数是过程的参数列表,参数之间用空格隔开,第三个参数是一个TCL脚本,代表过程体。proc生成一个新的命令,可以像固有命令一样调用:
add 1 2 #3
•在定义过程时,你可以利用return命令在任何地方返回你想要的值。return命令迅速中断过程,并把它的参数作为过程的结果。
局部变量和全局变量
•例如:
set a 4 #先置变量a为4
proc sample { x } { #创建过程
global a
incr a
return [expr $a+$x])
sample 3 #x=3,返回结果8
set a #获取变量a的值是5
•如果我们想在过程内部引用一个全局变量的值,可以使用global命令
•全局变量a在过程中被访问。在过程中对a的改变会直接反映到全局上。如果去掉语句global a, TCL会出错,因为它不认识变量a。
• 对于在过程中定义的变量 , 因为它们只能在过程中被访问,并且当过程退出时会被自动删除,所以为局部变量;在所有过程之外定义的变量称之为全局变量。
• TCL中 , 局部变量和全局变量可以同名 ,两者的作用域交集为空:局部变量的作用域是它所在的过程的内部:全局变量的作用域则不包括所有过程的内部。这一点和C语言有很大的不同.
字符串操作
•因为TCL把所有的输入都当作字符串看待,所以TCL提供了较强的字符串操作功能
语法:format formatstring ?value devalue...?
format命令类似于ANSIC中的sprintf函数,按formatstring提供的格式 ,把各个value的值组合到formatstring中形成一个新字符串返回。
set name john #John
set age 20 #20
set msg [format "%s is %d years old" $name $age] #john is 20 years old
• 语法:scan string format varName ?varName...?
scan命令可以认为是format命令的逆,其似于ANSIC中的scanf函数。它按format提供的格式分析string字符串,然后把结果存到变量varName中,注意除了空格和TAB键之外,string和format中的字符和'%'必须匹配。
scan "some 26 34" "some %d %d" a b
set a #26
set b #34
• 语法:regexp switchs -- Exp string matchVar \
subMatchVarsubMatchVar...?
regexp命令用于判断正规表达式exp是否全部或部分匹配字符串string,匹配返回1,否则0。
字符 意义
. 匹配任意单个字符
^ 表示从头进行匹配
$ 表示从末尾进行匹配
[chars] 匹配字符集合chars中给出的任意字符
* 对*前面的项0进行次或多次匹配
+ 对+前面的项进行1次或多次匹配
文件访问
• TCL提供了丰富的文件操作的命令。通过这些命令你可以对文件名进行操作(查找匹配某一模式的文件)、以顺序或随机方式读写文件、检索系统保留的文件信息(如最后访问时间)。
• TCL中文件名和我们熟悉的windows表示文件的方法有一些区别:在表示文件的目录结构时它使用'/'(linux终端文件目录也是用'/'),而不是‘\’,
open name access
open命令以access方式打开文件name。返回供其他命令(gets,close等)使用的文件标识。
文件的打开方式和我们熟悉的c语言类似,有以下方式:
r只读方式打开。文件必须已经存在。这是默认方式。
r+读写方式打开,文件必须已经存在。
w只写方式打开文件,如果文件存在则清空文件内容,否则创建一个新的空文件。
w+读写方式打开文件,如果文件存在则清空文件内容,否则创建新的空文件。
a只写方式打开文件,文件必须存在,并把指针指向文件尾。
a+读写方式打开文件,并把指针指向文件尾。如文件不存在,创建新的空文件
• open命令返回一个字符串用于表识打开的文件。
当调用别的命令(如:gets,puts,close〕对打开的文件进行操作时,就可以使用这个文件标识符。TCL有三个特定的文件标识:
stdin,stdout和stderr,分别对应标准输入、标准输出和错误通道,任何时候你都可以使用这三个文件标识。
•gets fileId varName
读fileld标识的文件的下一行,忽略换行符。如果命令中有varNam就把该行赋给它,并返回该行的字符数(文件尾返回-1) ,如果没有varName参数,返回文件的下一行作为命令结果(如果到了文件尾,就返回空字符串)。
• puts -nonewline fileld string
puts命令把string写到fileld中,如果没有nonewline开关的话,添加换行符。fileld默认是stdout。命令返回值为一空字符串。
flush fileld把缓冲区内容写到fileld标识的文件中,命令返回值为空字符串。
flush命令迫使缓冲区数据写到文件中,flush直到数据被写完才返回。当文件关闭时缓冲区数据会自动flush。
proc tgrep { pattern filename} {
set f [open $filename r]
while { [gets $f line ] } {
if {[regexp $ pattern $line]} {
puts stdout $line
}
}
close $f
} #TCL文件I/O的基本特点示例
• TCL提供两个命令来管理当前工作目录:pwd和cd。
pwd和UNIX下的pwd命令完全一样,没有参数,返回当前目录的完整路径。
cd 命令也和UNIX 命令也一样 , 使用一个参数 , 可以把工作目录改变为参数提供的目录 如果cd 没使用参数 , UNIX下 ,会把工作目录变为启动TCL脚本的用户的工作目录。
• TCL提供了两个命令进行文件名操作:glob和file,用来操作文件或获取文件信息。
• glob命令采用一种或多种模式为参数,并返回匹配这个(些)模式的所有文件的列表
文件访问
•语法为:glob switches pattern pattern ...
glob命令的模式采用string match命令的匹配规则。例如:
glob *.c *.h
main.c hash.c hash.h
• file delete *.tmp #不生效 不执行通配符展开
先使用glob命令返回文件列表,在使用参数展开语法{*}把列表元素作为独立参数提供给指令。
file delete {*}[glob *.tmp]
也可以选择使用eval
eval file delete [glob *.tmp]
file是有许多选项的常用命令,可以用来进行文件操作也可以检索文件信息。
file atime name #返回一个十进制的字符串,表示文件name最后被访问的时间。
时间是以秒为单位从1970年1月1日12:00AM开始计算。如果文件name不存在或查询不到访问时间就返回错误。例:
file atime license.txt #975945600
file copy -force -- source target
#这个命令把source中指明的文件或目录递归的拷贝到目的地址
targetDir,只有当存在-force选项时,已经存在的文件才会被覆盖。试图覆盖一非空的目录或以文件覆盖一个目录或以一个目录覆盖一文件都会导致错误。
file mkdir dir dir... # 创建dir中指明的目录
file owned name #如果name被当前用户拥有,返回1,否则返回0。
file executable name #如果name对当前用户是可以执行的,就返回1,否则返回0。