TCL:嵌套关联数组

TCL:嵌套关联数组,tcl,Tcl,可以在Tcl中创建嵌套关联数组吗?我知道我可以在tcl8.5或更高版本中使用“dict”,但我的代码需要在tcl8.4上运行 我希望这样做: array set A {} array set tmp {...} array set tmp1 {...} array set A($foo) tmp array set A($foo1) tmp1 所以foo/foo1是键,它们的值是关联数组。在python中,这就像是一个dict的dict 我正在尝试上面的方法,但tcl抱怨($foo)/A($f

可以在Tcl中创建嵌套关联数组吗?我知道我可以在tcl8.5或更高版本中使用“dict”,但我的代码需要在tcl8.4上运行

我希望这样做:

array set A {}
array set tmp {...}
array set tmp1 {...}
array set A($foo) tmp
array set A($foo1) tmp1
所以foo/foo1是键,它们的值是关联数组。在python中,这就像是一个dict的dict

我正在尝试上面的方法,但tcl抱怨($foo)/A($foo1)不是数组。

tcl的数组不能嵌套(除了在非常旧的tcl版本中,存在允许您嵌套的bug)。您通常可以使用组合键,如
a、b、c
(或
$a、$b、$c
)来实现类似效果,但这实际上只是利用了键是一般字符串而不是数字或简单单词这一事实

set A(123,$xyz) "the quick brown $fox"
set B($pqr,456) "the lazy dogs"
除此之外,您不能在变量中真正放置对变量的引用。你必须做一些额外的咀嚼:

foreach {key value} [array get tmp1] {
    set A($foo,$key) $value
}

Tcl 8.5的字典(映射是一个值,而不是一个变量集合)对于您想要做的事情来说确实是一个更好的解决方案,特别是因为8.4现在已经完全过时了(我知道其中有一些非常讨厌的bug无法修复)。我认为有一个
dict
包实现了8.4功能的部分后端口,但我不完全确定这一点,因为我没有打包,当时已经转到了8.5;它不会被维护…

不,tcl阵列严格来说是一维的。你可以为键构造复杂的字符串来伪造多维性:
set A(foo,bar,baz)qux
或者,数组值可以是列表,所以
set A($foo)[array get tmp]
我最好的尝试是
upvar 0 arrayvar(key)refvar
<代码>数组集refvar{key-value}。它不起作用:refvar尚不存在,但已被阻止,无法成为数组。