暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Tcl: 传引用调用 upvar

伪书虫笔记 2021-05-20
2318

我们在进行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把他们排序,在顺序输出这些元素。

文章转载自伪书虫笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论