变量可能是所有程序语言中最基本的元素。变量最基本的属性是它的名字(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