问题描述
我有一系列列表,如 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)
等而不是 a1
、a2
等) .但这确实意味着更改创建变量的代码。
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