变量可能是所有程序语言中最基本的元素。变量最基本的属性是它的名字(Name)和它所表示的值(Value)。
我们关心的是它的值。而名字是为了引用方便。
人们总喜欢对事物进行细分,因此变量可能会有不同的类型,也可能会有所谓的生存周期或者命名空间。
更多关于变量的思考,参见code:variable|程序设计中的变量
set
语句进行变量定义set variable_name variable_value set t_v1 123 set t_v2 "quick fox"
$
符号加变量名的方式进行变量引用puts $t_v1 puts $t_v2 puts ${t_v3}_hello
set
语句中,如果只有变量名,而没有变量值,则返回变量当前的值。这时也许应该称之为get
更合适。
这使得某些操作成为可能。比如所谓“变量的变量”、“双重变量”、或者变量名替换:
set t "tmp" ; set des.tmp.v 123 set v [set des.$t.v] set a "t" set v [get $a] ; # 类似于其他语言里的 $$a
可以unset
语句取消变量的定义。通常Tcl中是不需要取消变量的。但取消变量有助于释放内存。
unset variable_name unset t_v1 unset t_v2
proc
定义中,默认是不能访问定义在proc之外的变量的,所有的set
语句也只是影响proc定义内部的局部变量。proc
中访问全局变量,可以通过global
语句实现global
只是声明变量为全局变量,但并不会“定义”该变量set var_a "a_123" set var_b "b_123" proc myproc {} { global var_a ; # 声明为全局变量 puts $var_a ; # 输出:"a_123" catch {puts $var_b} ; # 错误:变量不存在 if [info exist var_b] { puts [set var_b] ; # 输出:"b_123" } else { puts "变量不存在" } set var_a "a_456" set var_b "b_456" global var_c ; # 新声明全局变量 set var_c "c_456" ; # 赋值后,外部可访问 global var_d ; # 新声明全局变量 # set var_d "d_456" ; # 并不赋值,外部不可访问 } myproc puts $var_a ; # 输出:"a_456",值已改变 puts $var_b ; # 输出:"b_123",值未改变 puts $var_c ; # 输出:"c_456",在proc中声明并赋值 puts $var_d ; # 错误!在proc中声明但未赋值
Tcl也有命名空间的概念。在namespace
中,变量的定义通过variable
语句来实现
namespace eval myns { variable var_a "var_a_value" variable var_b proc my_proc {} { variable var_a variable var_b "var_b_value" set var_a "var_a_value2" } }
作为一种程序语言,我们通常至少还需要下面几种变量类型以方便数据结构的构建。
严格来说,Tcl其实只有一种变量类型,就是字符串。所有其他变量类型都可以用一种特定的字符串形式来进行访问。
字符串是很基本的类型,在Tcl中,任何变量都可以看作是字符串。基本上所有的变量类型也都默认为字符串。常用的字符串操作可能有
set str "I am a string" string length $str string append str " appended"
由于Tcl中的变量默认都被视为字符串,要进行数值计算,就必须用特定的命令expr来实现。比如
set sum [expr 3.4+5.6] set div [expr 10/2] ; # Display 5 puts 10/2 ; # Display 10/2 other than 5