脚本语言TCl教程:7

1.10time & unset

1. 得到代码执行的时间

格式:time script?count?

功能:返回执行script 脚本count次的花费时间,注意是消耗时间,并不是cpu时间,这里cpu时间指的是在cpu上花费的时间片累加,而消耗时间是指等待程序执行完花费时间,通常cpu时间更短。

2. 从解释器的名称空间删除一个变量

格式:unset variableName1? varialeName2 ?......?

功能:从解释器的名称空间删除变量。如果变量名是个数组名,则整个数组被删掉,如果是数组中的某个项,则只删除那个项。如果删除的变量不存在,提示错误。

3.判断一个变量是否存在 existence variableName

例子:040_time.tcl

;#两个过程使用time测算运行时间和描述循环的优化,结论是列表比数组对某项的引用速度慢,还有就是列表和数组在tcl中都非常的大

proc timetst1 {lst} {

set x [lsearch $lst "20000"]

return $x

}

proc timetst2 {array} {

upvar $array a

return $a(20000);

}

;#做个大数组和大列表

for {set i 0} {$i < 20001} {incr i} {

set array($i) $i

lappend list $i

}

;#观察数组和列表的时间花费

puts "Time for list search: [ time {timetst1 $list} 10]"

puts "Time for array index: [ time {timetst2 array} 10]"

;#这个过程测试参数是否存在

proc existence {variable} {

upvar $variable testVar;

if {[info exists testVar]} {

puts "$variable Exists"

} else {

puts "$variable Does Not Exist"

}

}

set x 1

set y 2

for {set i 0} {$i < 5} {incr i} {

set a($i) $i;

}

puts "\ntesting unsetting a simple variable"

;# Confirm that x exists.

existence x

;# Unset x

puts "x has been unset"

unset x

;# Confirm that x no longer exists.

existence x

;# Do the same for a(0);

puts "\ntesting unsetting a member of an array"

existence a(0);

puts "a0 has been unset"

unset a(0);

existence a(0);

puts "\ntesting unsetting several members of an array, with an error"

existence a(3);

existence a(4);

catch {unset a(3) a(0) a(4)} ;#因为a(0)已经被删除,会引起错误

puts "\nAfter attempting to delete a(3), a(0) and a(4)"

existence a(3) ;# a(3)已经被删除,所以不存在

existence a(4) ;# a(4)由于删除a(0)时出错,所以并没有被删除,需要注意

puts "\ntesting unsetting an array"

existence a;

puts "a has been unset"

unset a ;#删除整个数组

existence a;

1.11socket & fileevent & vwait

1socket服务端开启

格式:socket –server command ?options? port

-server :表明开启的服务器端

port:端口

command:当有客户端来连接的时候,执行这个过程,这个过程有三个参数

channel:给新客户端的通道

address:提供给客户端连接的ip地址

port:端口

2.客户端连接服务器端

格式:socket ?options? host port

host port :客户端连接的服务器ip和端口

3fileevent定义了一个句柄,满足条件时执行

格式:fileevent channelId readable? script?

fileevent channelId writeable? script?

readable:当通道channelId有数据准备好被读了,执行脚本script

writeable:当通道channelId有数据准备好接收数据了,执行脚本script

4vwait命令使执行暂停,知道varName被赋值,即便赋值前后相同

格式:vwait varName

例子:041_socket.tcl

;#当有客户端连接上来的时候执行serverOpen

proc serverOpen {channel addr port} {

global connected

set connected 1

fileevent $channel readable "readLine $channel" ;#当通道可读的时候,执行readLine,所以这个readLine实际上是只有服务器端在使用

puts "OPENED"

}

proc readLine {channel} {

global didRead

if {[gets $channel line]<0} { ;#这是针对客户端通道关闭时,通道可读readLine被调用

fileevent $channel readable {} ;#通道即便可读也不执行任何命令

after idle "puts ok;close $channel;set out 1" ;#空闲回调,下一次进入事物循环时关闭通道

} else {

puts "READ LINE: $line"

puts $channel "This is a return"

flush $channel;

set didRead 1

}

}

set connected 0;

set didRead 0

# catch {socket -server serverOpen 33000} server

set server [socket -server serverOpen 33000] ;#这里只是注册了过程serverOpen,并没有调用

after 100 update ;#这个命令每100ms进入事件循环直到处理了所有的等待事件(包括空闲回调)

set sock [socket -async 127.0.0.1 33000] ;#在客户端连接的时候,才执行serverOpen; async是异步连接

puts "connected: $connected" ;#返回零

vwait connected ;#等待变量被赋值,即便新值和旧值相等

puts "connected: $connected" ;#返回一

puts $sock "A Test Line"

flush $sock ;#将值写入通道,于是可读了,readLine执行

puts "didRead : $didRead" ;#返回零

vwait didRead

puts "didRead : $didRead" ;#返回一

set len [gets $sock line]

puts "Return line: $len -- $line"

catch {close $sock} ;#关闭客户端通道的时候,会造成通道可读,执行readLine

vwait out

close $server

1.12:日期时间-clock

1.格式:clock seconds

功能:返回从计算机纪元开始的秒数,不同操作系统开始时间可能不同,所以这个值通常用来作为命令clock format的输入

2.格式:clock format clockValue ?-gmt boolean ? –format string?

clockValueclock clicks 返回

-gmt:设置为1或者true,则设置为格林威治时间,否则为当地时间

-format:将格式转化为可读字符串

序号

格式

描述

1

%a

缩写星期名称,例如:Mon,Tue

2

%A

写全星期名称,例如:Monday, Tuesday

3

%b

缩写月名称,例如:Jan, Feb

4

%B

写全月名称,例如:January, February

5

%d

月的第几日

6

%j

儒略日

7

%m

月数(01-12)

8

%y

世纪年

9

%Y

四位年

10

%H

小时(00-23)

11

%I

小时(00-12)

12

%M

分钟(00-59)

13

%S

(00-59)

14

%p

PMAM

15

%D

日期格式:%m/%d/%y

16

%r

时间格式:%I:%M:%s %p

17

%R

时间格式:%I:%M

18

%T

时间格式:%I:%M:%S

19

%Z

时区名称

3.功能:将可读的时间串转换成机器时钟,和clock seconds返回的一样

格式:clock scan dateString

dateString格式可以为:

time =hh:mm:ss ?meridian ?zone?

=hhmm ?meridian?zone?

meridianAMPM

hh:如果没有特别说明,hh指的24小时制

zone:为三个字母描述的时区,如EST,PDT

date =mm/dd/yy

=mm/dd

=monthname dd,yy

=monthname dd

=dd monthname yy

=dd monthname

=day, dd monthname yy

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这本教程花费了我足足两个月的时间写的,每个章节以例子为核心讲解知识点,最大的好处是要用的时候把代码粘贴一下,修改修改就可以上手用了,绝对原创,光是调试这些例子就够我折腾了。知识点覆盖比较全面,要个20分不过分吧,有几本书认真讲过那些常用模块: socket, 数据库操作,xml解析,多线程,最具体的做法多半是一带而过,我可是一个例子一个例子做出来的。 把目录发给大家看看: 2.1 第1课:简单文本输出 5 2.2 第2课:给变量赋值 5 2.3 第3课:命令的赋值与置换一 6 2.4 第4课:命令的赋值与置换二 7 2.5 第5课:命令的赋值与置换三 7 2.6 第6课:算数运算 8 2.7 第7课:文本比较-SWITCH应用 9 2.8 第8课:数值比较-IF应用 10 2.9 第9课:WHILE 循环 11 2.10 第10课:FOR循环和INCR 11 2.11 第11课:过程PROC 12 2.12 第12课:过程PROC的参数定义 13 2.13 第13课:变量的作用域 13 2.14 第14课:LIST结构 14 2.15 第15课:LIST项的增删改 15 2.16 第16课:更多LIST相关 16 2.17 第17课:字符串函数 17 2.18 第18课:更多字符串函数 17 2.19 第19课:修改字符串函数 20 2.20 第20课:正则表达式 21 2.21 第21课:更多正则表达式 22 2.22 第22课:数组 24 2.23 第23课:更多数组相关 25 2.24 第24课:文件存取 28 2.25 第25课:文件信息 30 2.26 第26课:TCL中的子进程调用-OPEN & EXEC 33 2.27 第27课:命令或者变量是否存在-INFO 34 2.28 第28课:解释器状态-INFO 35 2.29 第29课:过程信息-INFO 36 2.30 第30课:模块化-SOURCE 37 2.31 第31课:建库-UNKNOWN & INFO LIBRARY 38 2.32 第32课:创建命令-EVAL 40 2.33 第33课:在EVAL中应用FORMAT & LIST 40 2.34 第34课:不使用EVAL替换-FORMAT & SUBST 42 2.35 第35课:改变工作目录- CD & PWD 43 2.36 第36课:调试和错误-ERRORINFO & ERRORCODE & CATCH 44 2.37 第37课:调试-TRACE 45 2.38 第38课:命令行参数和环境串 46 2.39 第39课:TIME & UNSET 47 2.40 第40课:SOCKET & FILEEVENT & VWAIT 49 2.41 第41课:日期时间-CLOCK 51 2.42 第42课:I/O通道-FBLOCKED & FCONFIG 53 2.43 第43课:子解释器 56 2.44 第44课:数据库操作 57 2.45 第45课:函数或过程数组的输入和输出方法 59 2.46 第46课:INFO的用法 60 2.47 第47课:多线程 61 2.48 第48课:解析XML 72
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值