A-A+

Tcl/Tk脚本替换详解

2015年07月08日 脚本 阅读 2,960 views 次

变量替换是Tcl语法的重要组成部分,Tcl脚本的变量替换遵循以下两个原则:

1Tcl解析一条命令时,只从左向右解析一次,进行一轮替换。每一个字符只会被扫描一次。

2)每一个字符只会发生一层替换,而不会对替换后的结果再进行一次扫描替换。

下面将按照替换运算符对Tcl中的替换进行详细讲解。

1、运算符:$
作用:变量替换,变量名由$后面所有的数字、字母、下划线组成。
例:
1

set a 4
expr 6*$a
解析:将a替换为数值4,得出结果为24
2

set a 3
set b 4
expr $a*$b
解析:结果为12
3

foreach num{1 2 3 4 5} {
button .b$num
}
解析:这个示例创建了5个按钮组件,名称分别为.b1.b2.b3.b4.b5

2、运算符:[]
作用:命令替换。将一个单词的部分或全部替换为一个tcl脚本的值。方括弧内为一个有效的tcl脚本,可以由任意多条命令构成,命令之间用换行符或分号分开。
例:
set kgrams 20
set lbs [expr $kgrams*2.2046]
解析:lbs的值为44.092

3、运算符:
作用:
1)进行特殊符号替换。所支持的特殊替换序列同ANSI C,如n表示换行符,a代表警告音。如果后面的字符不在特殊序列中,那么就会被移除,而其后面的字符当作普通字符处理,如\将插入一个字符,$将插入一个$字符。
例:
set str How much is it?nIt is 3$.
输出:
How much is it?
It is 3$.
后面的空格将被视为字符“空格”,而不会被当作单词分隔符。
2)用作命令行续写,反斜杠加换行符再加下一行的空白会被替换为一个空格符,这样两行就组成了一个命令。此时用于替换反斜杠和换行符的空格符会被当作单词分隔符看待,除非它们被双引号或大括号括起来。

4、运算符:" "
作用:取消其中的单词和命令分隔符的特殊解释。双引号必须位于单词的开头,并由另一个双引号配对结束。双引号中的空格、换行符、制表符、分号都作为普通字符处理。
例:
1
set str "How much is it?nIt is 3$."
或:
set str "How much is it?
It is 3$."
输出:
How much is it?
It is 3$.
2
puts This is an "apple".
输出:
This is an "apple".
解析:双引号不位于单词的开头,双引号被当作普通字符处理。
3
set a 2;set msg "a is $a; The square of a is [expr $a*$a]"
输出:a is 2; The square of a is 4
解析:变量替换、命令替换、反斜线替换在双引号中仍正常进行,如果希望由双引号括起来的单词中包含双引号,则需要使用反斜线进行替换。如:
puts "This is an "apple""
输出:This is an "apple"

5、运算符:{ }
作用:取消其中所有特殊字符的特殊意义。如果一个单词以左大括号开头,直到与它配对的右大括号止,所有字符都将识别为这个单词的值。其中不会进行任何替换,所有的空格、制表符、换行符以及分号都作为普通字符处理。大括号可以进行嵌套。
例:
1
set a 2;set msg {a n $a*$a 
a ;$a}
输出:
a n $a*$a
a ;$a
解析:n会被当作普通字符对待,而不会被替换为换行。
2
set msg {This ia an 
apple}
输出:This ia an  apple
解析:在大括号中唯一被替换的是反斜线-换行符序列,这个替换是在解析命令之前进行的。
3
set msg {This is an } apple.}
输出:This is an } apple.
解析:反斜线后面的大括号被当作普通字符处理,而不参与配对。
4
proc occur {value list} {
set count 0
foreach el $list {
if $el==$value {
incr count
}
}
return $count
}
输入:occur 18 {1 34 18 16 18 72 1994 -3}
输出:2
解析:在这个例子中,大括号中的所有内容被当作一个单词传递给occur过程,而进行“延期处理”。TCL过程管理机制会把整个过程块传递给Tcl解析器进行处理。

6、运算符:{*}
作用:进行参数展开。如果一个单词以字符串{*}开头,之后紧接着非空白字符,Tcl会移除开头的{*},把该单词的剩余部分作为含有单词分隔符的语句进 行解析与替换。在替换之后,Tcl会再次解析这些单词,但不进行替换,校验确定它们的确是一个或多个语法完整的单词。校验通过则进行命令处理,校验失败则 报错
例:
file delete {*}[glob *.test]
此命令将删除目录下所有以.test结尾的文件,等同于如下命令:
eval file delete [glob *.test]

替换可以被使用的十分复杂,但是替换使用的原则应该是越简单越好。过于复杂的替换不但会降低程序的可靠性,而且不易于代码的阅读。当需要使用繁琐的指令时,最好能将指令拆成简单的语句,或者建立过程来完成相应功能。

个人公众号“数字化设计CAX联盟”,欢迎关注,共同交流
标签:
为您推荐:

给我留言

© 坐倚北风 版权所有 严禁镜像复制 苏ICP备15034888号. 基于 Ality 主题定制 AliCMS
联系邮箱:leanwind@163.con,微信公众号:数字化设计CAX联盟

用户登录

分享到: