赞
踩
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
//4
% proc sample{x}{
global a
incr a
return [expr $a+$x]}
%sample 3
//8
%set a
//5
如果我们想在过程内部引用一个全局变量的值,可以使用global命令
全局变量a在过程中被访问。在过程中对a的改变会直接反映到全局上。如果去掉语句global a,TCL会出错,因为它不认识变量a。
对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除,所以称为局部变量;在所有过程之外定义的变量我们称之为全局变量。
TCL中,局部变量和全局变量可以同名,两者的作用域的交集为空:局部变量的作用域是它所在的过程的内部;全局变量的作用域则不包括所有过程的内部。这一点和C语言有很大的不同.
因为TCL把所有的输入都当作字符串看待,所以TCL提供了较强的字符串操作功能。
//语法:
format formatstring ?vlue value...?
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中的sscanf函数。它按format提供的格式分析string字符串,然后把结果存到变量varName中,注意除了空格和TAB键之外,string 和format中的字符和%必须匹配。
%scan "some 26 34" "some %d %d" a b 2
%set a 26
%set b 34
//语法:
regexp ?switchs??--?Exp string?matchVar?\?
subMatchVar subMatchVar...?
regexp命令用于判断正规表达式exp是否全部或部分匹配字符串string,匹配返回1,否则0。
字符 | 意义 |
---|---|
. | 匹配任意单个字符 |
^ | 表示从头进行匹配 |
$ | 表示从末尾进行匹配 |
[chars] | 匹配字符集合chars中给出的任意字符 |
* | 对*前面的项进行单次或多次匹配 |
+ | 对+前面的项进行单次或多次匹配 |
TCL提供了丰富的文件操作的命令。通过这些命令你可以对文件名进行操作(查找匹配某一模式的文件)、以顺序或随机方式读写文件、检索系统保留的文件信息(如最后访问时间)。
TCL中文件名和我们熟悉的windows表示文件的方法有一些区别:在表示文件的目录结构时它使用’/’,而不是’’,
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?
读fileId标识的文件的下一行,忽略换行符。如果命令中有varName就把该行赋给它,并返回该行的字符数(文件尾返回-1),如果没有varName参数,返回文件的下一行作为命令结果(如果到了文件尾,就返回空字符串)。
puts?-nonewline??fileId?string puts
命令把string写到fileId中,如果没有nonewline开关的话,添加换行符。fileId默认是stdout。命令返回值为一空字符串。
flush fileId 把缓冲区内容写到fileId标识的文件中,命令返回值为空字符串。
flush命令迫使缓冲区数据写到文件中。flush直到数据被写完才返回。当文件关闭时缓冲区数据会自动fiush。
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。
这篇笔记参考众多资料整理而成,仅作学习心得交流,如果涉及侵权烦请请告知,我将第一时间处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。