`
universsky
  • 浏览: 92862 次
文章分类
社区版块
存档分类
最新评论

脚本语言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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics