如何在 Tcl 中的一个参数中使用带有多个变量的 puts?

问题描述

我有一系列列表,如 a1、a2、a3、a4、.... 我想循环打印它们,因此 a 和 i 都是变量。我该怎么做?

这不起作用。

for {set i 1}....
 puts $a$i
}

提前致谢

解决方法

理想情况下,您应该将它们放在关联数组中,否则……

要读取名称不是常量的变量,请使用带有只有一个参数set 命令,而不是 $ 语法。 (set 的这种使用早于 $。)

for {set i 1} {$i <= 3} {incr i} {
    puts [set a$i]
}

但是,最好使用数组(这样变量将有效地命名为 a(1)a(2) 等而不是 a1a2 等) .但这确实意味着更改创建变量的代码。

for {set i 1} {$i <= 3} {incr i} {
    puts $a($i)
}

访问变量变量的另一个现实选项是 upvar 命令。在全局命名空间中确实不推荐使用,但是在一个过程中非常有效。

proc printThree {} {
    for {set i 1} {$i <= 3} {incr i} {
        upvar 1 a$i vbl
        puts $vbl
    }
}

这在执行更复杂的操作时特别有效,而不仅仅是打印值。

,

列表:

set a1 [list 1 2 3 4]
set a2 [list 10 20 30 40]
set a3 [list 100 200 300 400]
set a4 [list 1000 2000 3000 4000]

foreach i [list {*}$a1] { puts "\$a$i: [set a$i]" }
# $a1: 1 2 3 4
# $a2: 10 20 30 40
# $a3: 100 200 300 400
# $a4: 1000 2000 3000 4000

作为数组:

array set a {
 1 {1 2 3 4}
 2 {10 20 30 40}
 3 {100 200 300 400}
 4 {1000 2000 3000 4000}
}

parray a
# a(1) = 1 2 3 4
# a(2) = 10 20 30 40
# a(3) = 100 200 300 400
# a(4) = 1000 2000 3000 4000

作为字典:

set a [dict create         \
a1 {1 2 3 4}               \
a2 {10 20 30 40}           \
a3 {100 200 300 400}       \
a4 {1000 2000 3000 4000}]  

dict for {k v} $a { puts "$k: $v" }
# a1: 1 2 3 4
# a2: 10 20 30 40
# a3: 100 200 300 400
# a4: 1000 2000 3000 4000

作为矩阵:

package require struct::matrix 

::struct::matrix xdata
xdata add columns 4
xdata add rows    4

xdata set rect 0 0 {
{1 2 3 4}
{10 20 30 40}
{100 200 300 400}
{1000 2000 3000 4000}
}

join [xdata get rect 0 0 end end] \n
# 1 2 3 4
# 10 20 30 40
# 100 200 300 400
# 1000 2000 3000 4000

#cleanup 
xdata destroy