大众两厢车尚酷-福特福克斯报价及图片
2023年11月24日发(作者:奔腾b50新车多少钱)
tcl脚本语言中文详解
T C L用法祥述
一TCL语法
1 脚本、命令和单词符号
一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符
或分号隔开,下面的两个脚本都是合法的:
set a 1
set b 2
或
set a 1;set b 2
TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,
另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。
TCL解释器对一个命令的求值过程分为两部分:分析和执行。在
分析阶段,TCL 解释器运用规则把命令分成一个个独立的单词,同时
进行必要的置换(substitution);在执行阶段,TCL 解释器会把第一个
单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这
个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过
程,让命令过程进行处理。
2 置换(substitution)
注:在下面的所有章节的例子中,\'%\'为TCL的命令提示符,输入
命令回车后,TCL会在接着的一行输出命令执行结果。\'//\'后面是我自
己加上的说明,不是例子的一部分。
TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,
例如:
%set x 10 //定义变量x,并把x的值赋为10
10
%set y x+100 //y的值是x+100,而不是我们期望的110
x+100
上例的第二个命令中,x被看作字符串x+100的一部分,如果我
们想使用x的值\'10\' ,就必须告诉TCL解释器:我们在这里期望的是
变量x的值,而非字符\'x\'。怎么告诉TCL解释器呢,这就要用到TCL
语言中提供的置换功能。
TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。
每种置换都会导致一个或多个单词本身被其他的值所代替。置换可以
发生在包括命令名在内的每一个单词中,而且置换可以嵌套。
1) 变量置换(variable subtitution)
变量置换由一个$符号标记,变量置换会导致变量的值插入一个
单词中。例如:
%set y $x+100 //y的值是10+100,这里x被置换成它的值10
10+100
这时,y的值还不是我们想要的值110,而是10+100,因为TCL
解释器把10+100看成是一个字符串而不是表达式,y要想得到值110,
还必须用命令置换,使得TCL会把10+100看成一个表达式并求值。
2) 命令置换(command substitution)
命令置换是由[]括起来的TCL命令及其参数,命令置换会导致某一
个命令的所有或部分单词被另一个命令的结果所代替。例如:
%set y [expr $x+100]
110
y的值是110,这里当TCL解释器遇到字符\'[\'时,它就会把随后的
expr作为一个命令名,从而激活与expr对应的C/C++过程,并把
\'expr\'和变量置换后得到的\'10+110\'传递给该命令过程进行处理。
如果在上例中我们去掉[],那么TCL会报错。因为在正常情况下,
TCL解释器只把命令行中的第一个单词作为看作命令,其他的单词都
作为普通字符串处理,看作是命令的参数。
注意,[]中必须是一个合法的TCL脚本,长度不限。[]中脚本的值
为最后一个命令的返回值,例如:
%set y [expr $x+100;set b 300] //y的值为300,因为set b 300
的返回值为300 300
有了命令置换,实际上就表示命令之间是可以嵌套的,即一个命
令的结果可以作为别的命令的参数。
3) 反斜杠置换(backslash substitution)
TCL语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用
于在单词符号中插入诸如换行符、空格、[、$等被TCL解释器当作特
殊符号对待的字符。例如:
set msg multiple space //msg的值为multiple space。
如果没有\'\'的话,TCL会报错,因为解释器会把这里最后两个单词
之间的空格认为是分隔符,于是发现set命令有多于两个参数,从而报
错。加入了\'\'后,空格不被当作分隔符,\'multiple space\'被认为是一
个单词(word)。又例如:
%set msg money $3333 nArray a[2]
//这个命令的执行结果为:money $3333
Array a[2]
这里的$不再被当作变量置换符。
TCL支持以下的反斜杠置换:
Backslash Sequence Replaced By
a Audible alert (0x7)
b Backspace (0x8)
f Form feed (0xc)
n Newline (0xa)
r Carriage return (0xd)
t Tab (0x9)
v Vertical tab (0xb)
ddd Octal value given by ddd
(one, two, or three d\'s)
xhh Hex value given by hh
(any number of h\'s)
newline space A single space character.
例如:
%set a x48 //对应xhh
H //十六进制的48正好是72,对应H
%set a 110 //对应ddd
H //八进制的110正好是72,对应H
%set a [expr // 对应newline space,一个命令可以用
newline转到下一行继续
2+3]
5
4) 双引号和花括号
除了使用反斜杠外,TCL提供另外两种方法来使得解释器把分隔
符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用
双引号和花括号({})。
TCL解释器对双引号中的各种分隔符将不作处理,但是对换行符
及$和[]两种置换符会照常处理。例如:
%set x 100
100
%set y \"$x ddd\"
100 ddd
而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意
义,TCL解释器不会对其作特殊处理。
%set y {/n$x [expr 10+100]}
/n$x [expr 10+100]
3 注释
TCL中的注释符是\'#\',\'#\'和直到所在行结尾的所有字符都被TCL
看作注释,TCL解释器对注释将不作任何处理。不过,要注意的是,\'
#\'必须出现在TCL解释器期望命令的第一个字符出现的地方,才被当
作注释。
例如:
%#This is a comment
%set a 100 # Not a comment
wrong # args: should be \"set varName ?newValue?\"
%set b 101 ; # this is a comment
101
第二行中\'#\'就不被当作注释符,因为它出现在命令的中间,TCL
解释器把它和后面的字符当作命令的参数处理,从而导致错误。而第
四行的\'#\'就被作为注释,因为前一个命令已经用一个分号结束,TCL
解释器期望下一个命令接着出现。现在在这个位置出现\'#\',随后的字
符就被当作注释了。
二变量
1 简单变量
一个TCL的简单变量包含两个部分:名字和值。名字和值都可以
是任意字符串。例如一个名为“1323 7&*: hdgg\"的变量在TCL中都
是合法的。不过为了更好的使用置换(substitution),变量名最好按
CC++语言中标识符的命名规则命名。TCL解释器在分析一个变量置
换时,只把从$符号往后直到第一个不是字母、数字或下划线的字符
之间的单词符号作为要被置换的变量的名字。例如:
% set a 2
2
set a.1 4
4
% set b $a.1
2.1
在最后一个命令行,我们希望把变量a.1的值付给b,但是TCL解
释器在分析时只把$符号之后直到第一个不是字母、数字或下划线的字
符(这里是\'.\')之间的单词符号(这里是\'a\')当作要被置换的变量的名字,
所以TCL解释器把a置换成2,然后把字符串“2.1”付给变量b。这显
然与我们的初衷不同。
当然,如果变量名中有不是字母、数字或下划线的字符,又要用
置换,可以用花括号把变量名括起来。例如:
%set b ${a.1}
4
TCL中的set命令能生成一个变量、也能读取或改变一个变量的值。
例如:
%set a {kdfj kjdf}
kdfj kjdf
如果变量a还没有定义,这个命令将生成变量a,并将其值置为
kdfj kjdf,若a已定义,就简单的把a的值置为kdfj kjdf。
%set a
kdfj kjdf
这个只有一个参数的set命令读取a的当前值kdfj kjdf。
2 数组
数组是一些元素的集合。TCL的数组和普通计算机语言中的数组
有很大的区别。在TCL中,不能单独声明一个数组,数组只能和数组
元素一起声明。数组中,数组元素的名字包含两部分:数组名和数组
中元素的名字,TCL中数组元素的名字(下标〕可以为任何字符串。
例如:
set day(monday) 1
set day(tuesday) 2
第一个命令生成一个名为day的数组,同时在数组中生成一个名
为monday的数组元素,并把值置为1,第二个命令生成一个名为
tuesday的数组元素,并把值置为2。
简单变量的置换已经在前一节讨论过,这里讲一下数组元素的置
换。除了有括号之外,数组元素的置换和简单变量类似。例:
set a monday
set day(monday) 1
set b $day(monday) //b的值为1,即day(monday)的值。
set c $day($a) //c的值为1,即day(monday)的值。
TCL不能支持复杂的数据类型,这是一个很大的缺憾,也是TCL受
指责很多的方面。但是TCL 的一个扩展ITCL填补了这个缺憾。
3 相关命令
set
这个命令在3.1已有详细介绍。
■unset
这个命令从解释器中删除变量,它后面可以有任意多个参数,每
个参数是一个变量名,可以是简单变量,也可以是数组或数组元素。例
如:
% unset a b day(monday)
上面的语句中删除了变量a、b和数组元素day(monday),但是
数组day并没有删除,其他元素还存在,要删除整个数组,只需给出
数组的名字。例如:
%puts $day(monday)
can\'t read \"day(monday)\": no such element in array
% puts $day(tuesday)
2
%unset day
% puts $day(tuesday)
can\'t read \"day(tuesday)\": no such variable
■append和incr
这两个命令提供了改变变量的值的简单手段。
append命令把文本加到一个变量的后面,例如:
% set txt hello
hello
% append txt \"! How are you\"
hello! How are you
incr命令把一个变量值加上一个整数。incr要求变量原来的值和
新加的值都必须是整数。
%set b a
2
%incr b 3
5
三表达式
1 操作数
TCL表达式的操作数通常是整数或实数。整数一般是十进制的,
但如果整数的第一个字符是
0(zero),那么TCL将把这个整数看作八进制的,如果前两个字符
是0x则这个整数被看作是十六进制的。TCL的实数的写法与ANSI C
中完全一样。如:
2.1
7.9e+12
6e4
3.
2 运算符和优先级
下面的表格中列出了TCL中用到的运算符,它们的语法形式和用
法跟ANSI C中很相似。这里就不一一介绍。下表中的运算符是按优先
级从高到低往下排列的。同一格中的运算符优先级相同。
语法形式结果操作数类型
-a !a ~a 负a
非a
int,float
int,float
int
a*b a/b a%b 乘
除
取模
int,float
int,float
int
a+b a-b 加
减
int,float
int,float
a<>b 左移位
右移位
int
int
ab a<=b a>=b 小于
大于
小于等于
大于等于
int,float,string
int,float,string
int,float,string
int,float,string
a= =b a!=b 等于
不等于
int,float,string
int,float,string
a&b位操作与int
a^b位操作异或int
a|b位操作或int
a&&b逻辑与int,float
a||b逻辑或int,float
a?b:c选择运算a:int,float
3 数学函数
TCL支持常用的数学函数,表达式中数学函数的写法类似于
CC++语言的写法,数学函数的参数可以是任意表达式,多个参数之
间用逗号隔开。例如:
%set x 2
2
% expr 2* sin($x<3)
1.68294196962
其中expr是TCL的一个命令,语法为:expr arg ?arg ...?
两个?之间的参数表示可省,后面介绍命令时对于可省参数都使
用这种表示形式。expr可以有一个或多个参数,它把所有的参数组合
到一起,作为一个表达式,然后求值:
%expr 1+2*3
7
%expr 1 +2 *3
7
需要注意的一点是,数学函数并不是命令,只在表达式中出现才
有意义。
TCL中支持的数学函数如下
log10( x) Base 10 logarithm of x.
pow( x, y) x raised to the power y.
round( x) Integer value produced by rounding x.
sin( x) Sine of x ( x in radians).
sinh( x) Hyperbolic sine of x.
sqrt( x) Square root of x.
tan( x) Tangent of x ( x in radians).
tanh( x) Hyperbolic tangent of x.
TCL中有很多命令都以表达式作为参数。最典型的是expr命令,
另外if、while、for等循环控制命令的循环控制中也都使用表达式作为
参数。
四list
1 List命令
list这个概念在TCL中是用来表示集合的。TCL中list是由一堆元
素组成的有序集合,list可以嵌套定义,list每个元素可以是任意字符
串,也可以是list。下面都是TCL中的合法的list:
{} //空list
{a b c d}
{a {b c} d} //list可以嵌套
list是TCL中比较重要的一种数据结构,对于编写复杂的脚本有很
大的帮助,TCL提供了很多基本命令对list进行操作,下面一一介绍:
语法:list ? ?
这个命令生成一个list,list的元素就是所有的value。例:
% list 1 2 {3 4}
1 2 {3 4}
2 concat命令
语法:concat list ??
这个命令把多个list合成一个list,每个list变成新list的一个元
素。
3 lindex命令
语法:lindex list index
返回list的第index个(0-based)元素。例:
% lindex {1 2 {3 4}} 2
3 4
4 llength命令
语法:llength list
返回list的元素个数。例
% llength {1 2 {3 4}}
3
5 linsert命令
语法:linsert list index value ??
返回一个新串,新串是把所有的value参数值插入list的第index
个(0-based)元素之前得到。例:
% linsert {1 2 {3 4}} 1 7 8 {9 10}
1 7 8 {9 10}
2 {
3 4}
6 lreplace命令
语法:lreplace list first last ?value value ...?
返回一个新串,新串是把list的第firs (0-based)t到第last 个(0-
based)元素用所有的value 参数替换得到的。如果没有value参数,
就表示删除第first到第last个元素。例:
% lreplace {1 7 8 {9 10} 2 {3 4}} 3 3
1 7 8
2 {
3 4}
% lreplace {1 7 8 2 {3 4}} 4 4 4 5 6
1 7 8
2 4 5 6
7 lrange命令
语法:lrange list first last
返回list的第first (0-based)到第last (0-based)元素组成的串,如
果last的值是end。就是从第first个直到串的最后。
例:
% lrange {1 7 8 2 4 5 6} 3 end
2 4 5 6
8 lappend命令
语法:lappend varname value ??
把每个value的值作为一个元素附加到变量varname后面,并返
回变量的新值,如果varname 不存在,就生成这个变量。例:
% lappend a 1 2 3
1 2 3
% set a
1 2 3
9 lsearch命令
语法:lsearch ?-exact? ?-glob? ?-regexp? list pattern
返回list中第一个匹配模式pattern的元素的索引,如果找不到匹
配就返回-1。-exact、-glob、-regexp是三种模式匹配的技术。-
exact表示精确匹配;-glob的匹配方式和string match 命令的匹配
方式相同,将在后面第八节介绍string命令时介绍;-regexp表示正
规表达式匹配,将在第八节介绍regexp命令时介绍。缺省时使用-
glob匹配。例:
% set a { how are you }
how are you
% lsearch $a y*
2
% lsearch $a y?
-1
10 lsort命令
语法:lsort ?options? list
这个命令返回把list排序后的串。options可以是如下值:
-ascii 按ASCII字符的顺序排序比较.这是缺省情况。
-dictionary 按字典排序,与-ascii不同的地方是:
(1)不考虑大小写
(2)如果元素中有数字的话,数字被当作整数来排序.
因此:bigBoy排在bigbang和bigboy之间, x10y 排在x9y和
x11y之间.
-integer 把list的元素转换成整数,按整数排序.
-real 把list的元素转换成浮点数,按浮点数排序.
-increasing 升序(按ASCII字符比较)
-decreasing 降序(按ASCII字符比较)
-command command TCL自动利用command 命令把每两个元
素一一比较,然后给出排序结果。
11 split命令
语法:split string ?splitChars?
把字符串string按分隔符splitChars分成一个个单词,返回由这
些单词组成的串。如果splitChars
是一个空字符{},string被按字符分开。如果splitChars没有给出,
以空格为分隔符。例:
% split \"\" .
how are you
% split \"how are you\"
how are you
% split \"how are you\" {}
h o w { } a r e { } y o u
12 join命令
语法:join list ?joinString?
join命令是命令的逆。这个命令把list的所有元素合并到一个字符
串中,中间以joinString分开。缺省的joinString是空格。例:
% join {h o w { } a r e { } y o u} {}
how are you
% join {how are you} .
五控制流
1 if命令
TCL中的控制流和C语言类似,包括if、while、for、foreach、
switch、break、continue 等命令。
语法:if test1 body1 ?elseif test2 ? ?else bodyn?
TCL先把test1当作一个表达式求值,如果值非0,则把body1当
作一个脚本执行并返回所得值,否则把test2当作一个表达式求值,如
果值非0,则把body2当作一个脚本执行并返回所得值……。例如:
if { $x>0 } {
.....
}elseif{ $x==1 } {
.....
}elseif { $x==2 } {
....
}else{
.....
}
注意,上例中\'{\'一定要写在上一行,因为如果不这样,TCL 解释
器会认为if命令在换行符处已结束,下一行会被当成新的命令,从而
导致错误的结果。在下面的循环命令的书写中也要注意这个问题。书
写中还要注意的一个问题是if 和{之间应该有一个空格,否则TCL解释
器会把\'if{\'作为一个整体当作一个命令名,从而导致错误。
2 循环命令
循环命令包括while、for、foreach等。
■while命令
语法为: while test body
参数test是一个表达式,body是一个脚本,如果表达式的值非0,
就运行脚本,直到表达式为0才停止循环,此时while命令中断并返
回一个空字符串。
例如:
假设变量 a 是一个链表,下面的脚本把a 的值复制到b:
set b \" \"
set i [expr [llength $a] -1]
while { $i>=0}{
lappend b [lindex $a $i]
incr i -1
}
■for命令
语法为: for init test reinit body
参数init是一个初始化脚本,第二个参数test是一个表达式,用
来决定循环什么时候中断,第三个参数reinit是一个重新初始化的脚
本,第四个参数body也是脚本,代表循环体。下例与上例作用相同:
set b \" \"
for {set i [expr [llength $a] -1]} {$i>=0} {incr i -1} {
lappend b [lindex $a $i] }
■foreach命令
这个命令有两种语法形式
1)、foreach varName list body
第一个参数varName是一个变量,第二个参数list 是一个表(有
序集合),第三个参数body 是循环体。每次取得链表的一个元素,都
会执行循环体一次。下例与上例作用相同:
set b \" \"
foreach i $a{
set b [linsert $b 0 $i]
}
2)、foreach varlist1 list1 ?varlist2 list2 ...? Body
这种形式包含了第一种形式。第一个参数varlist1是一个循环变量
列表,第二个参数是一个列表list1,varlist1中的变量会分别取list1
中的值。body参数是循环体。?varlist2 list2 ...?表示可以有多个变量
列表和列表对出现。例如:
set x {}
foreach {i j} {a b c d e f} {
lappend x $j $i
}
这时总共有三次循环,x的值为\"b a d c f e\"。
set x {}
foreach i {a b c} j {d e f g} {
lappend x $i $j
}
这时总共有四次循环,x的值为\"a d b e c f {} g\"。
set x {}
foreach i {a b c} {j k} {d e f g} {
lappend x $i $j $k
}
这时总共有三次循环,x的值为\"a d e b f g c {} {}\"。
break和continue命令
在循环体中,可以用break和continue命令中断循环。其中
break命令结束整个循环过程,并从循环中跳出,continue只是结束
本次循环。
■switch 命令
和C语言中switch语句一样,TCL中的switch命令也可以由if
命令实现。只是书写起来较为烦琐。switch命令的语法为: switch ?
options? string { pattern body ? pattern body ...?}
第一个是可选参数options,表示进行匹配的方式。TCL支持三种
匹配方式:-exact方式,-glob 方式,-regexp方式,缺省情况表示-
glob方式。-exact方式表示的是精确匹配,-glob方式的匹配方式和
string match 命令的匹配方式相同(第八节介绍),-regexp方式是正规
表达式的匹配方式(第八节介绍)。第二个参数string 是要被用来作测试
的值,第三个参数是括起来的一个或多个元素对,例:
switch $x {
a -
b {incr t1}
c {incr t2}
default {incr t3}
}
其中a的后面跟一个\'-\'表示使用和下一个模式相同的脚本。
default表示匹配任意值。一旦switch命令找到一个模式匹配,就执
行相应的脚本,并返回脚本的值,作为switch命令的返回值。
3 eval命令
eval命令是一个用来构造和执行TCL脚本的命令,其语法为:
eval arg ?arg ...?
它可以接收一个或多个参数,然后把所有的参数以空格隔开组合
到一起成为一个脚本,然后对这个脚本进行求值。例如:
%eval set a 2 ;set b 4
4
4 source命令
source命令读一个文件并把这个文件的内容作为一个脚本进行求
值。例如:
source e:/tcl&c/
注意路径的描述应该和UNIX相同,使用\'/\'而不是\'\'。
六过程(procedure)
1过程定义和返回值
TCL支持过程的定义和调用,在TCL中,过程可以看作是用TCL脚
本实现的命令,效果与TCL 的固有命令相似。我们可以在任何时候使
用proc命令定义自己的过程,TCL中的过程类似于C 中的函数。
TCL中过程是由proc命令产生的:
例如:
% proc add {x y } {expr $x+$y}
proc命令的第一个参数是你要定义的过程的名字,第二个参数是
过程的参数列表,参数之间用空格隔开,第三个参数是一个TCL脚本,
代表过程体。proc生成一个新的命令,可以象固有命令一样调用:
% add 1 2
3
在定义过程时,你可以利用return命令在任何地方返回你想要的
值。return命令迅速中断过程,并把它的参数作为过程的结果。例如:
% proc abs {x} {
if {$x >= 0} { return $x }
return [expr -$x]
}
过程的返回值是过程体中最后执行的那条命令的返回值。
2 局部变量和全局变量
对于在过程中定义的变量,因为它们只能在过程中被访问,并且
当过程退出时会被自动删除,所以称为局部变量;在所有过程之外定
义的变量我们称之为全局变量。TCL中,局部变量和全局变量可以同
名,两者的作用域的交集为空:局部变量的作用域是它所在的过程的
内部;全局变量的作用域则不包括所有过程的内部。这一点和C语言
有很大的不同.
如果我们想在过程内部引用一个全局变量的值,可以使用global
命令。例如:
8
%set a
5
全局变量a在过程中被访问。在过程中对a的改变会直接反映到
全局上。如果去掉语句global a,TCL会出错,因为它不认识变量a。
3 缺省参数和可变个数参数
TCL还提供三种特殊的参数形式:
首先,你可以定义一个没有参数的过程,例如:
proc add {} { expr 2+3}
其次,可以定义具有缺省参数值的过程,我们可以为过程的部分
或全部参数提供缺省值,如果调用过程时未提供那些参数的值,那么
过程会自动使用缺省值赋给相应的参数。和CC++中具有缺省参数值
的函数一样,有缺省值的参数只能位于参数列表的后部,即在第一个
具有缺省值的参数后面的所有参数,都只能是具有缺省值的参数。
例如:
proc add {val1 {val2 2} {val3 3}}{
expr $val1+$val2+$val3
}
则:
add 1 //值为6
add 2 20 //值为25
add 4 5 6 //值为15
另外,TCL的过程定义还支持可变个数的参数,如果过程的最后
一个参数是args, 那么就表示这个过程支持可变个数的参数调用。调用
时,位于args以前的参数象普通参数一样处理,但任何附加的参数都需
要在过程体中作特殊处理,过程的局部变量args将会被设置为一个列
表,其元素就是所有附加的变量。如果没有附加的变量,args就设置
成一个空串,下面是一个例子:
proc add { val1 args } {
set sum $val1
foreach i $args {
incr sum $i
}
return $sum
}
则:
add 2 //值为2
add 2 3 4 5 6 //值为20
4 引用:upvar
命令语法:upvar ?level? otherVar myVar ?otherVar myVar ...?
upvar命令使得用户可以在过程中对全局变量或其他过程中的局
部变量进行访问。upvar命令的第一个参数otherVar是我们希望以引
用方式访问的参数的名字,第二个参数myVar 是这个过程中的局部变
量的名字,一旦使用了upvar 命令把otherVar 和myVar 绑定,那么在
过程中对局部变量myVar 的读写就相当于对这个过程的调用者中
otherVar 所代表的局部变量的读写。下面是一个例子:
% proc temp { arg } {
upvar $arg b
set b [expr $b+2]
}
% proc myexp { var } {
set a 4
temp a
return [expr $var+$a]
}
则:
% myexp 7
13
这个例子中,upvar 把$arg(实际上是过程myexp中的变量a)和
过程temp中的变量b绑定,对b的读写就相当于对a的读写。
upvar命令语法中的level参数表示:调用upvar命令的过程相对
于我们希望引用的变量myVar在调用栈中相对位置。例如:
upvar 2 other x
这个命令使得当前过程的调用者的调用者中的变量other,可以在
当前过程中利用x访问。缺省情况下,level的值为1,即当前过程(上
例中的temp)的调用者(上例中的myexp)中的变量(上例中myexp的
a)可以在当前过程中利用局部变量(上例中temp的b)访问。
如果要访问全局变量可以这样写:
upvar #0 other x
那么,不管当前过程处于调用栈中的什么位置,都可以在当前过
程中利用x访问全局变量other。
七字符串操作
1 format命令
因为TCL把所有的输入都当作字符串看待,所以TCL提供了较强
的字符串操作功能,TCL中与字符串操作有关的命令有:string、
format、regexp、regsub、scan等。
format命令
语法:format formatstring ??
format命令类似于ANSIC中的sprintf函数和MFC中CString
类提供的Format成员函数。它按formatstring提供的格式,把各个
value的值组合到formatstring中形成一个新字符串,并返回。例如:
%set name john
John
%set age 20
20
%set msg [format \"%s is %d years old\" $name $age]
john is 20 years old
2 scan命令
语法:scan string format varName ?varName ...?
scan命令可以认为是format命令的逆,其功能类似于ANSI C中
的sscanf函数。它按format 提供的格式分析string字符串,然后把
结果存到变量varName中,注意除了空格和TAB键之外,string 和
format中的字符和\'%\'必须匹配。例如:
% scan \"some 26 34\" \"some %d %d\" a b
2
% set a
26
% set b
34
上海五菱汽车最新款-日产轩逸落地价多少钱
更多推荐
开c260l的都是穷人
发布评论