在TCL中,我有一些名称带有数字后缀的数组(即名称以数字结尾),如下所示:
array set ps0 [ list 0 15.885 1 55.43 1 0.254 2 0.227 3 0.177 ]
array set ps1 [ list 0 6.585 1 56.43 1 0.254 2 0.227 3 0.177 ]
array set ps2 [ list 0 32.485 1 43.13 1 0.254 2 0.227 3 0.177 ]
我需要在 TCL 中迭代这些并获取值,但是,无论我做什么来转义数字后缀,我都无法同时获取数组和内容。我尝试过的一切,例如:
ps$i($i)
"ps$i($i)"
甚至使用类似的集合:
set p ps$i
...无法获取具有数字索引的数组。我收到错误:
Original error: can't read "ps": no such variable
...所有可能的组合。我怎样才能做到这一点(在 TCL 中)?
答案1
任何时候你试图在运行时构建一个变量名,这都是一个很大的迹象,表明你做错了,应该使用dict
相反(通常比数组更容易使用)。在这种情况下,多维字典:
dict set ps 0 [dict create 0 15.885 1 55.43 1 0.254 2 0.227 3 0.177]
dict set ps 1 [dict create 0 6.585 1 56.43 1 0.254 2 0.227 3 0.177]
dict set ps 2 [dict create 0 32.485 1 43.13 1 0.254 2 0.227 3 0.177]
puts [dict get $ps 1 0] ;# 6.585
dict set ps 1 0 3.14159 ;# Change it to pi
# Print out all the key-value pairs in the ps dict associated with 0
dict for {k v} [dict get $ps 0] {
puts "$k\t$v"
}
这文档对于变量替换来说$name(index)
:
姓名给出数组变量的名称和指数给出该数组中元素的名称。姓名只能包含字母、数字、下划线和命名空间分隔符,并且可以是空字符串。字母和数字只是标准的 ASCII 字符(0–9,A-Z和a-z)
所以这就是为什么类似的东西不适合你的部分原因ps$i($i)
- 名称中没有完成变量替换。在该示例中,它正在寻找名为i
无论如何的数组变量。
答案2
dicts 显然是更好的选择。
有一种方法可以使用数组来完成这项工作。使用upvar
将动态名称链接到“临时”名称
foreach i {0 1 2} {
puts "ps$i"
upvar 0 ps$i tmp
parray tmp
}
ps0
tmp(0) = 15.885
tmp(1) = 0.254
tmp(2) = 0.227
tmp(3) = 0.177
ps1
tmp(0) = 6.585
tmp(1) = 0.254
tmp(2) = 0.227
tmp(3) = 0.177
ps2
tmp(0) = 32.485
tmp(1) = 0.254
tmp(2) = 0.227
tmp(3) = 0.177
由于数组键是连续整数,我想知道为什么你不使用普通列表。