在 TCL 中迭代数组,其中数组名称具有数字后缀

在 TCL 中迭代数组,其中数组名称具有数字后缀

在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-Za-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

由于数组键是连续整数,我想知道为什么你不使用普通列表。

相关内容