我们在进行Tcl脚本的编写时,经常需要用到proc命令,这个命令主要是用来进行过程的编写;功能类似于c语言中的function;由于Tcl只支持参数的传值调用,当调用Tcl的命令时,是复制了参数的值然后将其传给命令;即使参数的值来自一个变量也是这样,因此Tcl解释器执行命令前会把参数替换为它的值;tcl不支持指针和引用类型,所以,看上去我们无法编写一个过程来改变已经存在的变量值。不过,变量的名称也是一个字符串值,它也可以存到一个变量当中,因此我们可以通过多轮的替换模拟出引用的行为,比如说下面的方式:
set x “the value of x”
set y x
set $y
>the value of x
tcl的解释器把$y替换为字符串值x。然后执行set命令,把它的参数解析成一个变量的名称,返回存放在该变量中的值。
upvar 命令就提供了访问当前范围之外的变量的通用机制。可以用于访问全局变量、命名空间变量以及其他活动过程内的局部变量。
例如:
proc printArray {name} {
upvar $name a
foreach el [lsort [array names a]] {
puts "$el = $a($el)"
}
}
set info(age) 37
set info(position) "vice president"
printArray info
>age = 37
position = vice president
当调用printArray时候,给出数组的名称作为参数。upvar命令使得过程可以通过变量a访问这个数组。upvar的第一个参数是过程的调用环境可见的变量。这可以是一个全局变量,比如这个例子,也可以是一个命名空间变量,也可以是调用过程的内部变量。第二个参数是一个局部变量的名称。upvar命令把对局部变量a的返回重定向到调用环境中名为name的变量。这个实例中,当printArray读取a时,它读取的都是info全局变量中的元素。如果printArray向a写入,它就会修改info。printArray使用array names命令取得数组中所有元素的列表。然后用lsort把他们排序,在顺序输出这些元素。




