下面Tcl脚本示例虽然看似简单,但清楚阐述了Tcl语法的本质!
目录
1. 脚本、命令和单词
#Tcl脚本包含一条命令或多条命令。
#多条命令之间可通过两种方式隔开。
#1:换行符 2:分号。
set x 1
set y 2
set z 3
#上述代码是三条命令组成的脚本,命令间用换行符隔开。
#也可用分号隔开,写成如下形式:
set x 1; set y 2; set z 3
#每条命令包含多个单词,第一个单词是命令名,其余的是参数。
#command argument1 argument2 argument3
#单词之间通过空白符隔开
#上述命令中:空白符、换行符及分号都不属于单词的一部分。
2. 解析和执行
#Tcl处理命令分两步走:解析和执行。
#解析阶段:Tcl解释器,认为所有的命令参数均是字符串,没有任何具体意义,并对字符串进行替换操作。
#执行阶段:命令中单词均有具体含义,Tcl把第一个单词作为command,剩余单词作为argument。
#语法结构:set valName value
set x 1
puts $x
#输出结果是1,通过set赋值命令将字符串1赋给变量x。
set y x+2
puts $y
#输出结果是x+2,同样将字符串x+2赋给变量y。
#如果想要获取变量x的值,则必须使用Tcl置换功能中的变量置换符号$。
set y $x+2
puts $y
#输出结果是1+2,解析阶段,美元符号的存在,使得字符$x被字符1替换。
#如果想要计算表达式的则,则必须使用Tcl的数学运算命令expr。
set y [expr $x+2]
puts $y
#输出结果是3,上述中括号[]为Tcl的命令置换功能。
#如果没有该中括号,会因不符合set命令的规则而报错。
#这是应为Tcl解释器执行set命令过程时,认为其后面接了y、expr、$x+2三个字符串。
3. 置换
#Tcl提供三种置换形式,1.变量置换$ 2.命令置换[] 3.反斜线置换\
#置换操作是在Tcl解释器执行命令过程之前,可对所有单词进行置换操作。
#1.变量置换 美元符号$
set x 1
puts $x
#输出结果是1,字符串$x被字符1替换。
set x+1 100
puts $x+1
#输出结果是1+1,字符串$x被字符1替换。
set x-1 100
puts $x-1
#输出结果是1-1,字符串$x被字符1替换。
set x.1 100
puts $x.1
#输出结果是1.1,字符串$x被字符1替换。
set x*1 100
puts $x*1
#输出结果是1*1,字符串$x被字符1替换。
set xa 100
puts $xa
#输出结果是100,字符串$xa被字符100替换。
set x1 100
puts $x1
#输出结果是100,字符串$x1被字符100替换。
set x_1 100
puts $x_1
#输出结果是100,字符串$x_1被字符100替换。
#由此可见,Tcl解释器在进行变量置换时变量名,仅包括$符号及往后的数字、字母、下划线。
#遇到如+、-、*、.等符号,则截止。
#命令置换[]
#Tcl解释器遇见方括号,将启动命令置换。
#[方括号中所有内容,作为一个独立的Tcl脚本处理]。
#方括号及其里面所有内容将被Tcl脚本的最终结果替换。
set x 1
set y 2
set z 3
set a [expr $x*$y-$z]
puts $a
#输出结果是-1,Tcl解释器遇到[]时,会将里面的expr $x*$y-$z这一条命令当作独立的脚本。
#脚本的执行结果为-1,所以字符串[expr $x*$y-$z]被-1替换。相当于set a 1。
puts [set a [expr $x*$y-$z]]
#输出结果是-1,这条命令是为了表达命令是可以嵌套的。
#内层命令的结果作为外层命令的参数了。相当于puts -1。
set a [expr $x*$y-$z ; set b 100]
puts $a
puts [set a [expr $x*$y-$z ; set b 100]]
#输出结果是100,表明[中括号里面脚本的结果为最后一条命令的返回值]。
#反斜线置换\
#对于换行符、空白符、[]、{}、$等,Tcl解释器当作特殊符号处理。
#反斜线的作用则是,取消特殊字符的特殊含义;以及给普通字符添加特殊含义。
set x 1
puts $x ; #输出结果是1。
puts \$x ; #输出结果是$x。
puts HelloTcl ;#输出结果是HelloTcl。
#当我们想在Hello与Tcl之间输入空格时,可用\取消空白符的特殊意义。
puts Hello\ Tcl ;#输出结果是Hello Tcl。
puts Hello Tcl ;#因空白符存在而报错。
set price Eggs:\ \$2.5/dozen\nCoke:\ \$0.5/bottle
puts $price
#输出结果如下
Eggs: $2.5/dozen
Coke: $0.5/bottle
#第一个\取消空白符特殊含义,第二个\取消$特殊含义,第三个\n赋予普通字符n特殊含义。
#\n等价于换行符。