目录
简单变量
一个 TCL 的简单变量包含两个部分:名字和值。名字和值都可以是任意字符串。例如一个名为 “1323 7&*: hdgg"的变量在 TCL 中都是合法的。不过为了更好的使用置换(substitution), 变量名最好按 C\C++语言中标识符的命名规则命名。 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。
数组
数组是一些元素的集合。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 填补了这个缺憾。
相关命令
set
set 命令能生成一个变量、也能读取或改变一个变量的值。
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
输出:a
incr b
输出:expected integer but got "a"
set b 2
输出:2
incr b 3
5