|
楼主 |
发表于 2020-4-14 16:24
|
显示全部楼层
TCL语法简介
* Y7 j$ b2 y8 Q/ w( m- e o3 H' Z6 s$ K9 J! c# b/ r8 J; |( p
1.基本语法
: ]/ Y0 X6 q# z- }TCL语言的语法实际上是一些TCL解释器怎样对TCL命令进行分析的规则的集合,TCL 的基本语法类似于 UNIX shell:命令由用空格或 TAB 分隔的一个或多个字段组成。第一个字段是命令的名字,它可以是内置命令、特定于应用的命令、或者是由一系列的 TCL命令组成的过程。在第一个单词后面的字段都作为参数传递给命令。 , K! B5 A o7 p- p) S
(1)注释6 H. f5 Y+ ^/ `! {
关于TCL的注释有一个特殊的要求:'#'必须出现在TCL解释器期望命令的第一个字符出现的地方,才被当作注释。* }+ R1 V. j+ P) g! O8 P
例如:
: h6 D9 ^+ E- b: @. Wset a 1 # Not a comment0 Y. @$ l% K# h0 h$ F* w) e' o
set b 2 ; # this is a comment* S7 B4 S4 F, o: V- h
第一个例子中'#'及其后面的内容会被当作set 的参数而非注释从而导致参数个数错误;但第二个被解释为注释,因为'#'前面有一个分号,而分号和换行一样被看作是命令的分隔符。
" M5 Z6 [; D) K) d(2)eval命令
( x! o# _8 \7 Y H ~7 qeval命令是一个用来构造和执行TCL脚本的命令,其语法为: . E7 H1 x, `& d! A$ [9 c/ Y
, t B- R: C3 I& s3 ], \! ?% X
+ s; S- x9 b5 E' jeval arg arg ...# W* I# L- g4 {6 i/ L+ O
它可以接收一个或多个参数,然后把所有的参数以空格隔开组合到一起成为一个脚本,然后对这个脚本进行求值。2 \& Y: E) a, T: k9 l' {! K
(3)source命令( d# o+ E! f# l! O1 G7 F2 Y
source命令读一个文件并把这个文件的内容作为一个脚本进行求值。例如:
* X- G! e w( x* l X, Y& t: z9 y+ Rsource e:/tcl&c/hello.tcl
, b' [: U, C! G( p' j注意路径的描述应该和UNIX相同,使用'/'而不是'\'。
, K" S. f! e* ^" y5 C2.置换(Substitution)
6 O/ h8 L: \. J4 @3 `: _" X3 Qset x 10+ V8 Z$ S( I$ u9 @4 R; B1 W+ z
set y 100 + x
" U& H# b$ q& U上面命令执行后,y的值是“100 + x”而不是我们期望的110。这是因为TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,所以x 被看作了字符串“100 + x”的一部分。如果我们想使用x的值'10' ,就必须告诉TCL解释器:我们在这里期望的是变量x的值,而非字符'x'。怎么告诉TCL解释器呢,这就要用到TCL语言中提供的置换功能。1 Z# g- w* S8 o# X- @' J7 r" B
+ R: a W! W/ o/ y, q% P# `4 E Y; [9 I0 v
TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单词本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。
6 G% t, Q3 o# T# I6 {: H(1)变量置换(variable substitution)
{/ Z1 s/ X, ~4 V& Y8 Z/ R变量置换由一个$符号标记,变量置换会导致变量的值而非变量(标识符)本身被插入到字符串中。
; K& x* L1 m$ }, O. o1 iset x 10
& C# i* ?; B8 ^3 s6 h! |set y 100 + $x
% x- B1 O: U7 _* ^) o0 K( @1 i* Y6 h; i! U, H3 G
这时,y的值还不是我们想要的值110,而是10+100,因为TCL解释器把10+100看成是一个字符串而不是表达式;y要想得到值110,还必须用命令置换,使得TCL会把10+100看成一个表达式并求值。$ P) p& k4 X) r
(2)命令置换(command substitution)9 s% I+ Z6 F4 z
命令置换是由[ ]括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词(参数)被另一个命令的结果所代替。
+ Q6 @+ b/ V( g+ M7 r; a2 ~set x 10# J; G/ n3 @% O" v) _& ]' D- @6 V
set y [expr 100+$x]
% T2 }: ]4 W/ [6 \5 }, N+ S; r% M* ]- I
这时,y的值就是110了。这里当TCL解释器遇到字符'['时,它就会把随后的expr作为一个命令名,从而激活与expr对应的C/C++过程,并把expr命令中变量置换后得到的'10+110'传递给该命令过程进行处理。. O( e: X4 {. V$ \/ G
注意,[ ]中必须是一个合法的TCL脚本,长度不限。[ ]中脚本的值为最后一个命令的返回值。
" f6 I- }$ a r! v* r; p# n& s; W有了命令置换,实际上就表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参数。" \! d3 ^; U( I& Y* e5 b; ]' M2 Y
(3)反斜杠置换(backslash subtitution)
$ q. Z9 V# j# W+ L# a. gTCL语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、[、$等被TCL解释器当作特殊符号对待的字符。例如:
( X# ?8 }* k) b1 r: k; B7 ~/ \1 ^% k8 l9 P: a
: @% k! v; c+ g
set msg multiple\ space 3 ?6 |2 H' @) ~2 h
如果没有'\'的话,TCL会报错,因为解释器会把这里最后两个单词之间的空格认为是分隔符,于是发现set命令有多于两个参数,从而报错。加入了'\'后,空格不被当作分隔符,'multiple space'被认为是一个单词(word)。2 L" p2 u, G3 J; _$ n
(4)双引号和花括号
, q; M, W+ ?6 {3 D6 j: p除了使用反斜杠外,TCL提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用双引号“”和花括号{}。TCL解释器对双引号中的各种分隔符将不作处理,但是对换行符及$和[]两种置换符会照常处理。而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作特殊处理。
( {! N! F: N$ T0 z4 J
# f1 b% B! u9 H- }2 G% G8 Y# x; u2 O1 U# q( v" r2 k
5 S' A- v, ]3 f+ v
; T( g( @/ m1 q) n1 ^5 W9 v/ M9 K4 w) j7 W- J$ @4 \
|
|