TCL程序安装说明:tcl安装程序必须放在根目录下,比如D:\。
2014-1-17
tcl开讲了,今天是第一期,掌声鼓励鼓励。
第一期讲些基础的东西。
认识脚本、命令、单词
脚本是由一条或多条命令组成的可运行文件,像training.tcl就是一个脚本。
命令由一个或多个单词组成,第一个单词是命令名,其它的是单词是命令的参数。如:set a 7
命令由换行符或分号隔开,单词通过空格或制表符隔开。
tcl处理一个命令分两步:解析和执行。
在解析步骤中,tcl运用各种规则(替换、引用等),将命令分解为单词,并执行替换。tcl不关心单词的内容。
在执行步骤中,各单词才有具体意义,tcl解析器调用具体的命令过程,将命令中的全部单词传递给该过程。
所谓替换就是把单词中的原始字符替换成另外一些值
tcl提供三种替换:变量替换、命令替换、反斜线替换
变量替换由$符引发,将tcl变量的值插入单词中。
命令替换由[ ]引发,将命令的执行结果传递给其它命令。
反斜线替换由\引起,用于向单词中插入像换行符这样的字符,以及像[、$这样的会被tcl解析器认为是有特殊含义的字符。
序号 |
字符 |
输出 |
十六进制 |
1 |
\a |
响铃 |
\x07 |
2 |
\b |
回车 |
\x08 |
3 |
\f |
清屏 |
\x0c |
4 |
\n |
换行 |
\x0a |
5 |
\r |
回车 |
\x0d |
6 |
\t |
制表符 |
\x09 |
7 |
\v |
垂直制表符(Vertical Tab) |
\x0b |
8 |
\ddd |
八进制值 |
d=0-7 |
9 |
\xhh |
十六进制值 |
h=0-9,A-F,a-f |
所谓引用就是利用特殊办法阻止解析器对$和分号等字符进行特殊处理,保留其本意。
tcl提供两种引用:双引号引用和大括号引用
双引号引用由" "引发,双引号是定界符,不属于单词的一部分。双引号取消其中的单词和命令分隔符的特殊解释。也即空格、制表位、换行以及分号都当做普通字符处理,但替换能正常进行。
大括号引用由{ }引号,大括号也是定界符。大括号取消单词中所有特殊字符的特殊意义,所有字符原封不动。
proc test1 {} {
#命令通过换行或分号隔开
set a1 24 ;set b1 15
set ab [expr $a1*$b1]
set abc [set abcd 555]
puts "a1 is $a1 \nb1 is $b1"
puts "a1*b1 is $ab" ;#计算乘法
puts "abc 是 $abc" ;#可以有中文
puts {a1*b1 is $ab} ;#输出结果不变
}
2014-1-17
tcl第二讲,今天我们做练习,将上一讲的知识消化吸收加以巩固,其中会穿插讲一些规则,初次学习编程语言,一定要将规范都整清楚。
上一讲讲到了这么知识点:
脚本、命令、单词
命令的分隔、单词的分隔
三种替换
两种引用
注释
方括号引用里面可以有多条命令,用分号或换行符隔开,传递最后一条命令的值。
\ 、\$、\"对特殊字符不做转义
\n:换行符
\t:制表位
反斜线-换行符-下一行开头的空白,会被替换为一个空格,在tcl解析前就会单独执行
变量替换、命令替换、以及反斜线替换在双引号中能正常进行。
如果想要在双引号括起来的单词中包含双引号,则应该使用反斜线替换。
proc test2 { } {
set x 4
set a1 24 ;set b1 15
set y [ expr $x * 5 ; expr $x+10]
set msg eggs:\ \$2.18/dozen\ngasoline:\ \$2.49/gallon
set hello moyu\tyotc
set wahaha \"a1*b1\ is\ $ab\"
set tianlong \
babu
set msk "a1 is $a1; the square of a1 is [expr $a1*$a1]"
set name a.out
set msr "couldnt open file \"$name\""
}
大括号最重要的应用之一就是延期处理,
proc test3 {value list} {
set count 0
foreach e1 $list {
if $e1==$value {
incr count
}
}
return $count
}
要把一大段文字注释掉,可以用如下的方法:
proc test4 {value} {
puts "come on,lets go"
while {$value >=0} {
puts " value = $value"
incr value -1
}
}
proc test5 {value} {
puts "come on,lets go"
if 0 {
while {$value >=0} {
puts " value = $value"
incr value -1
}
}
}
有关替换命令的思考
1、替换的两条规则:
(a)tcl解析一条命令时,只从左向右解析一次,进行一轮替换。每个字符只会被扫描一次。
(b)每一个字符只会发生一层替换,而不会对替换后的结果再进行一次扫描替换。
2、替换可以用被用得十分复杂,但是不建议这么用。两种办法可以应对复杂替换:
(a)用format、subst及list等命令协助处理复杂的替换情况。
(b)建立过程,将复杂的操作隔离开来。
2014-1-18
tcl第三讲
这次讲tcl的变量。tcl的变量分两种:简单变量和关联数组。
proc test6 { } {
set a6 jiangnanbaguai
set a6
set a6 12.6
set a6 [expr $a6*4]
puts $a6
append a6 32
}
上面这个例子有点意思。先看前面三步:
(a) set命令后面有两个参数,a6和 jiangnanbaguai,由于a6事前没有创建,所以这步动作是先创建a6变量,然后将jiangnanbaguai赋值给a6。
(b) set命令后面只有一个参数,a6,这种情况下返回变量的当前值,这好理解。
(c) set命令后面有两个参数,a6和12.6,由于a6事先已经创建,所以这步是修改a6的值。
简单变量的故事我们讲完了,现在我们来讲内部数据存储。
怎么理解?我们知道tcl是基于字符串的语言,tcl中所有的值都有字符串表达形式,其中一部分有效率更高的内部表达形式。tcl会根据需要自动转换字符串和内部表达形式。比如上面的例子:
(d) set a6 12.6中,tcl只存储变量的字符串表达形式,也即tcl把12.6认为是个字符串,而不认为是浮点数等其它的形式。
(e) set a6 [expr $a6*4],在执行expr命令时,tcl会把字符串值解析为该值的内部浮点数表达形式。当set命令把expr的结果传递给a6时,只有内部浮点数表达形式存在。
(f) puts $a6,将a6重新当做字符串对待,tcl在保留该值的内部表达形式的同时,产生该值的字符串表达形式。
(g) append a6 32,由于该命令修改了a6的字符串表达形式,tcl会更新该值的字符串表达形式的同时释放其内部浮点数表达形式。
别忘了还有另一类变量我们还没讲,下面我们来看看关联数组是怎么回事。
proc test7 { } {
set week(monday) 700
set week(tuesday) 600
set week(wednesday) 500
set week(thursday) 400
set week(friday) 300
set week(saturday) 200
set week(sunday) 100
set weektotal 0
puts "lets