re
问题31:TCL中的目录管理和文件操作当前工作目录:
TCL提供两个命令来管理当前工作目录:pwd和Cd。
pwd和UNIX下的pwd命令完全一样, 没有参数,返回当前目录的完整路径。
cd 命令也和UNIX命令也一样,使用一个参数,可以把工作目录改变为参数提供的目录。如果cd 没使用参数,UNIX下,会把工作目录变为启动TCL脚本的用户的工作目录,WINDOWS下会把工作目录变为windows操作系统的安装目录所在的盘的根目录(如:C:/)。值得注意的是,提供给cd的参数中路径中的应该用'/'而不是'\',如 cdC:/TCL/lib,这是UNIX的风格。
文件操作:
file命令
file copy ?-force??--?sourcetarget
file copy ?-force??--?source?source ...? targetDir
这个命令把source中指明的文件或目录递归的拷贝到目的地址targetDir,只有当存在-force选项时,已经存在的文件才会被覆
盖。试图覆盖一个非空的目录或以一个文件覆盖一个目录或以一个目录覆盖一个文件都会导致错误。
file delete ?-force? ?--? pathname ?pathname ... ?
这个命令删除pathname指定的文件或目录,当指定了-force时,非空的目录也会被删除。即使没有指定-force,只读文件也
会被删除。删除一个不存在的文件不会引发错误。
file mkdir dir ?dir ...?
这个命令和UNIX的mkdir命令类似,创建dir中指明的目录。如果dir已经存在,这个命令不作任何事情,也不返回错误。不过如
果试图用一个目录覆盖已经存在的一个文件会导致错误。这个命令顺序处理各个参数,如果发生错误的话,马上退出。
file rename ?-force? ?--? source target
file rename ?-force? ?--? source ?source ...? targetDir
这个命令同时具有重命名和移动文件(夹)的功能。把source指定的文件或目录改名或移动到targetDir下。 只有当存在-force
选项时,已经存在的文件才会被覆盖。 试图覆盖一个非空的目录或以一个文件覆盖一个目录或以一个目录覆盖一个文件都会导
致错误。
问题32:如何用TCL脚本来实现将字符串(含中文)转换为ASCII串?
脚本范例:
proc ConvertStrToASCII {Str} {
set StrLen ;
set ConvertedStr "";
set TempFile
puts $TempFile $Str;
close $TempFile;
set TempFile ;
set StrLen ;
for {set i 0} {$i<$StrLen} {incr i 1} {
set ASCIIOfCurChar ;
if {$ASCIIOfCurChar==""} {
break;
}
scan $ASCIIOfCurChar "%c" ASCIIOfCurChar
lappend ConvertedStr $ASCIIOfCurChar;
};
close $TempFile;
return $ConvertedStr;
}
[ 本帖最后由 ameg3 于 2009-12-9 17:50 编辑 ]
re
问题33:TCL对网络和协议的支持TCL对TCP协议的支持是通过一组命令实现的。它建立TCP连接是使用socket命令,以建立服务器端或客户端socket(由于在TCL中把socket和文件基本等同,都看作信道(channel〕,并且使用相同的操作命令,所以下面介绍命令时使用信道,以求得介绍更具普遍性,不过在建立TCP连接时你可以把信道理解为一个socket)。然后利用fconfigure命令来设置或获取信道的各项参数,并利用puts、flush、gets、read、fcopy等命令对信道进行读写。另外还需要一个vwait命令,以进入TCL事件循环,利用TCL的事件驱动机制
问题34:面向对象的TCL——ITCL
ITCL是INCR TCL的缩写,也称TCL++,是TCL的一个重要扩展,并和TCL完全兼容,ITCL支持面向对象的程序设计。 ITCL扩展TCL类似于C++扩展C,ITCL中借用了C++的很多概念,因此熟悉C++的人会觉得学习ITCL比较容易。
面向对象的编程可以提高软件重用的程度和效率,改善程序结构。目前TCL已经被广泛用于我们的测试工作中,如何进一步提高我们编写脚本的效率和脚本的重用性成为一个突出的问题,ITCL正好可以部分的解决这个问题,这也是我们引入ITCL的原因。
ITCL中,一个类实际上就是一个名字空间(namedpace),不过提供了一些额外的功能来生成和管理对象,而且类的定义也更严格。但是名字空间中的很多概念和类类似,比如限定名,完全限定名等。
[ 本帖最后由 ameg3 于 2009-12-9 17:53 编辑 ]
re
问题35:通过vwait命令和after命令组合来触发事件【功能】
直至变量写入时执行某事件
【语法】
vwait varName
【描述】
该命令进入TCL事件循环之中执行事件,如果没有就绪事件将阻塞应用。它将继续执行事件,直至某些事件句柄设置了变量varName。一旦设置了varName,修改varName的事件句柄一完成,evwait命令将马上返回。varName必须是全局范围内有效(或者通过gobal命令调用varName,或者标明全namespace路径)。
在一些情况下,当设置完varName后vwait命令并不立即返回。设置varName的事件句柄没有立即完成时就会发生这种情况。例如,如果事件句柄设置了varName,接着它自身调用了vwait命令以等待另外一个变量,这样很长时间该命令都有可能不返回。在这段时间内,级别最高的vwait命令处于阻塞态,等待事件句柄完成,因此它不能随意返回。
【样例】
proc temp1 {} {
global conn
set conn 1
puts "setting conn 1"
}
after 1000 temp1
after info
set conn 0
puts "test vwait command and setting conn 0"
puts "waiting for set conn again..."
vwait conn
after info
puts "conn == $conn"
puts "game over"
【输出】
after#0
test vwait command and setting conn 0
waiting for set conn again...
setting conn 1
conn == 1
game over
【解析】
该命令仅在仿真版本上可行,实际单板操作时不建议使用之;
注意在执行vwait前后after info的内容,在执行前是存在的,在执行完毕后自动删除id,这与语法描述是相符的
re
re
页:
1
[2]