Scripting 使新旧变量向后兼容

Scripting 使新旧变量向后兼容,scripting,tcl,proc,Scripting,Tcl,Proc,v1-旧变量,v2-新变量。。目前,如果有人设置v1,它将出错,所以我使它向后兼容。因此,如果在任何地方定义了旧的var v1,我想使这两个变量相同,即v2=v1(v1的值也应该在v2中) 设置v1测试 为此,我有一个新老名字的散列 set oldvars(v1) v2 foreach ele [array names oldvars] { if {([info exists ele] || $ele == "") && $oldvars($ele)!

v1-旧变量,v2-新变量。。目前,如果有人设置v1,它将出错,所以我使它向后兼容。因此,如果在任何地方定义了旧的var v1,我想使这两个变量相同,即v2=v1(v1的值也应该在v2中)

设置v1测试

为此,我有一个新老名字的散列

    set oldvars(v1) v2


    foreach ele [array names oldvars] {
    if {([info exists ele] || $ele == "") && $oldvars($ele)!= ""} {
      o2n $ele $oldvars($ele) //o2n is a proc defined below
    }
    }

    proc o2n {gvar gval}
        global v1
        puts "gvar is $gvar, gval is $gval" //prints gvar - v1 and gval - v2
        set $gval [set $$gvar] **//Error - Cant read $v1 no such variable. Above line does print gvar = v1 so $$gvar should be $v1 =test**
        puts "$gval [set $gvar]" // Has the value of v1 i.e test
    }

 puts "v2 is $v2" **: Error : Can't read v2 no such variable**
如果我们假设

set a1 1
set b1 2
set c1 3

set oldvars(a1) a2
set oldvars(b1) b2
set oldvars(c1) c2
要将值从x1变量复制到相应的x2变量,只需

foreach {x1 x2} [array get oldvars] {
    set $x2 [set $x1]
}
赋值看起来有点不对劲,但它的意思是“将名在
x2
中的变量的值赋值给名在
x1
中的变量”

如果希望通过过程执行此操作,则需要考虑该过程的代码在另一个作用域中执行。
uplevel
命令有助于实现这一点,并且作为副作用,分配代码变得更简单:

proc o2n {x1 x2} {
    upvar 1 $x1 v1 $x2 v2
    set v2 $v1
}

foreach {x1 x2} [array get oldvars] {
    o2n $x1 $x2
}
检查是否存在

如果以存储变量名称的变量的形式保留对变量的引用,那么对存在性的测试看起来也与通常的测试不同。如果你有

foreach ele [array names oldvars] {
变量
ele
保证存在(它是由
foreach
创建的,只要列表不是空的–但是
foreach
的主体无论如何都不会执行),但它不是您想要验证的变量:它只保存您想要验证的变量的名称。因此,您需要这样编写测试:

info exists $ele
(您还需要位于
ele
引用的变量存在的相同范围内)

这看起来很奇怪,因为我们通常非常小心地验证变量的名称,而不是值。但在本例中,变量的值是我们要验证的名称,所以

在过程内部,编写测试更容易。
upvar
命令在当前作用域中创建名称,这些名称链接到另一个作用域中的变量。如果这些变量不存在,则本地名称实际上将是未设置变量的名称

upvar 1 $x1 v1 $x2 v2
if {[info exists v1]} {
文件: , , , , , ,