? ?
从命令行读入参数; 从环境变量读入
2.命令行参数:argc得到参数个数,argv0得到程序自身名字,argv得到其他参数,注意没有argv1这类的全局变量
3.env是存储着环境变量的数组,对环境变量修改只是当前程序中生效了
例子:039_arg.tcl
puts \
puts \ ;#得到程序名 if {$argc > 0} {puts \ ;#得到其他的参数
puts \ou have these environment variables set:\foreach index [array names env] { puts \ }
set prompt \
if { [info exists env(PROMPT)] } {
puts \ ;#返回 $P$G
set env(PROMPT) $prompt ;#设置环境变量为$P,程序执行完后仍然是$P$G,因为它只是在该程序中生效了 puts \}
2.39 第39课:time & unset
讲解:
1. 得到代码执行的时间 格式:time script?count?
功能:返回执行script 脚本count次的花费时间,注意是消耗时间,并不是cpu时间,这里cpu时间指的是在cpu上花费的时间片累加,而消耗时间是指等待程序执行完花费时间,通常cpu时间更短。
2. 从解释器的名称空间删除一个变量 格式:unset variableName1? varialeName2 ?......?
功能:从解释器的名称空间删除变量。如果变量名是个数组名,则整个数组被删掉,如果是数组中的某个项,则只删除那个项。如果删除的变量不存在,提示错误。
3.判断一个变量是否存在 existence variableName
例子:040_time.tcl
;#两个过程使用time测算运行时间和描述循环的优化,结论是列表比数组对某项的引用速度慢,还有就是列表和数组
第 46 页 共 60 页
在tcl中都非常的大
proc timetst1 {lst} { set x [lsearch $lst \ 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 \puts \
;#这个过程测试参数是否存在 proc existence {variable} { upvar $variable testVar; if {[info exists testVar]} { puts \ } else {
puts \ } } set x 1 set y 2
for {set i 0} {$i < 5} {incr i} { set a($i) $i; }
puts \ ;# Confirm that x exists. existence x ;# Unset x puts %unset x
;# Confirm that x no longer exists. existence x
第 47 页 共 60 页
;# Do the same for a(0);
puts \existence a(0); puts %unset a(0); existence a(0);
puts \existence a(3); existence a(4);
catch {unset a(3) a(0) a(4)} ;#因为a(0)已经被删除,会引起错误 puts \
existence a(3) ;# a(3)已经被删除,所以不存在
existence a(4) ;# a(4)由于删除a(0)时出错,所以并没有被删除,需要注意
puts \existence a;
puts \
unset a ;#删除整个数组 existence a;
2.40 第40课:socket & fileevent & vwait
讲解:
1.socket服务端开启
格式:socket –server command ?options? port -server :表明开启的服务器端 port:端口
command:当有客户端来连接的时候,执行这个过程,这个过程有三个参数 channel:给新客户端的通道
address:提供给客户端连接的ip地址 port:端口
2.客户端连接服务器端 格式:socket ?options? host port
host port :客户端连接的服务器ip和端口
3.fileevent定义了一个句柄,满足条件时执行
第 48 页 共 60 页
格式:fileevent channelId readable? script?
fileevent channelId writeable? script?
readable:当通道channelId有数据准备好被读了,执行脚本script writeable:当通道channelId有数据准备好接收数据了,执行脚本script
4.vwait命令使执行暂停,知道varName被赋值,即便赋值前后相同 格式:vwait varName
例子:041_socket.tcl
;#当有客户端连接上来的时候执行serverOpen proc serverOpen {channel addr port} { global connected set connected 1
fileevent $channel readable \ $channel\ ;#当通道可读的时候,执行readLine,所以这个readLine实际上是只有服务器端在使用
puts \}
proc readLine {channel} { global didRead
if {[gets $channel line]<0} { ;#这是针对客户端通道关闭时,通道可读readLine被调用
fileevent $channel readable {} ;#通道即便可读也不执行任何命令 after idle \ ;#空闲回调,下一次进入事物循环时关闭通道 } else {
puts \ puts $channel \ 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 \ ;#返回零
vwait connected ;#等待变量被赋值,即便新值和旧值相等
第 49 页 共 60 页
puts \ ;#返回一
puts $sock \
flush $sock ;#将值写入通道,于是可读了,readLine执行
puts \ ;#返回零 vwait didRead
puts \ ;#返回一
set len [gets $sock line] puts \
catch {close $sock} ;#关闭客户端通道的时候,会造成通道可读,执行readLine vwait out close $server
2.41 第41课:日期时间-clock
讲解:
1.格式:clock seconds
功能:返回从计算机纪元开始的秒数,不同操作系统开始时间可能不同,所以这个值通常用来作为命令clock format的输入
2.格式:clock format clockValue ?-gmt boolean ? –format string? clockValue:clock clicks 返回
-gmt:设置为1或者true,则设置为格林威治时间,否则为当地时间 -format:将格式转化为可读字符串 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 格式 %a %A %b %B %d %j %m %y %Y %H %I %M %S 描述 缩写星期名称,例如:Mon,Tue等 写全星期名称,例如:Monday, Tuesday等 缩写月名称,例如:Jan, Feb 等 写全月名称,例如:January, February 等 月的第几日 儒略日 月数(01-12) 世纪年 四位年 小时(00-23) 小时(00-12) 分钟(00-59) 秒(00-59) 第 50 页 共 60 页