TCL脚本语言(5)

2020-04-14 06:39

? ?

从命令行读入参数; 从环境变量读入

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 页


TCL脚本语言(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《前端 Web开发基础》课程标准

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: