TCL获取第二级变量的值

TCL获取第二级变量的值,tcl,Tcl,我一直在处理TCL问题。我想在保留格式(列表)的情况下访问第二级变量的内容。 请查看我的代码: 首先,我声明变量内容 set x1y {1 2 3 4} set x2y {10 11 12 13} 在我执行for循环之后 for { i 0} {i < 4} { incr i} 你有什么想法/建议吗。我尝试了subst,但它没有保持格式。 提前感谢您设置x1y{1 2 3 4} set x1y {1 2 3 4} set x2y {10 11 12 13} for {set i 1}

我一直在处理TCL问题。我想在保留格式(列表)的情况下访问第二级变量的内容。 请查看我的代码: 首先,我声明变量内容

set x1y {1 2 3 4}
set x2y {10 11 12 13}
在我执行for循环之后

for { i 0} {i < 4} { incr i}
你有什么想法/建议吗。我尝试了subst,但它没有保持格式。 提前感谢您

设置x1y{1 2 3 4}
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
     }
}
集x2y{10 11 12 13}
对于{set i 1}{$i而言,从名称不是常量的变量读取的方法是使用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的数组是关联数组;你可以使用复合键以及简单的整数):


您可能希望尽量避免使用
eval
subst
进行此类操作;如果不小心,这些命令会产生副作用,可能会损害代码的稳定性。对于此类情况,绝对不会使用这些命令。(而且,它们会更慢,因为它们会迫使Tcl更频繁地重新编译其内部字节码。我上面介绍的所有解决方案都没有这种错误。)

感谢您的反馈。不幸的是,它不起作用。我将添加更多细节。以下代码给出了错误:“foreach surf”中的“无效命令名1 2 3 4”[eval$List_Surf]{“步骤集Raidisseur_1_Surface_Sup{78 79 84 85}集Raidisseur_2_Surface_Sup{92 93 98 99}用于{set j 1}{$j
foreach i {1 2} {
    upvar 0 x${i}y xy
    foreach val $xy {
        puts "$i --> $val"
    }
}
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"
    }
}