首页 > 解决方案 > 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 {
  ....
 }

你有什么想法/建议。我尝试了 subst 但它不保留格式。先感谢您

标签: tcl

解决方案


从名称不是常量的变量中读取的方法是使用 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 的数组是关联数组;你可以使用复合键以及简单的整数):

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"
    }
}

你可能想尽量避免使用evalorsubst来做这类事情;如果您不小心,这些命令会产生副作用,可能会损害代码的稳定性。绝对不是这样的情况。(此外,它们会变慢,因为它们会迫使 Tcl 更频繁地重新编译其内部字节码。我上面介绍的所有解决方案都没有这种错误功能。)


推荐阅读