TCL获取第二级变量的值

时间:2019-06-04 08:10:23

标签: tcl

我停留在TCL问题上。我希望在保持格式(列表)的情况下访问第二级变量的内容。 请看我的代码: 首先,我声明变量内容

set x1y {1 2 3 4}
set x2y {10 11 12 13}

执行for循环

for { i 0} {i < 4} { incr i}

我希望在xy变量中保留列表格式的x1y

 set xy [eval ["x${i}y"]]
 foreach x $xy {
  ....
 }

您有任何想法/建议吗?我尝试了替代,但它没有保留格式。 预先谢谢你

2 个答案:

答案 0 :(得分:1)

从名称不是常量的变量中读取的方法是使用set的单参数形式:

set x1y {1 2 3 4}
set x2y {10 11 12 13}

foreach i {1 2} {
    foreach val [set x${i}y] {
        puts "$i --> $val"
    }
}

但是,通常更容易使用upvar 0为变量创建别名,如下所示:

foreach i {1 2} {
    upvar 0 x${i}y xy
    foreach val $xy {
        puts "$i --> $val"
    }
}

几乎在每种情况下,您都应该考虑使用数组(记住Tcl的数组是 associative 数组;您可以使用复合键以及简单的整数):< / p>

set xy(1) {1 2 3 4}
set xy(2) {10 11 12 13}

foreach i {1 2} {
    foreach val $xy($i) {
        puts "$i --> $val"
    }
}

您可能想避免使用evalsubst这样的东西;如果您不小心,这些命令的副作用可能会损害代码的稳定性。绝对不是这样的情况。 (而且,它们会变慢,因为它们会迫使Tcl更加频繁地重新编译其内部字节码。我上面介绍的所有解决方案都没有这种缺点。)

答案 1 :(得分:0)

set x1y {1 2 3 4}
set x2y {10 11 12 13}
for {set i 1} {$i <= 2} {incr i} {
     foreach e [set x${i}y] {
            puts $e
     }
}