如何使用dict在tcl中附加嵌套的dict

时间:2016-03-01 11:13:26

标签: dictionary nested append tcl

我希望在Tcl中有一个嵌套字典,并附加一个值。 但是嵌套并没有真正起作用...... 见代码:

> set k [dict create]
> dict append k fee foo " kak"
> dict append k fee foo " poached"
> puts [dict get  [dict get $k fee] foo ]<code>

结果是:

missing value to go with key
    while executing
"dict get  [dict get $k fee] foo "
    invoked from within
"puts [dict get  [dict get $k fee] foo ]"

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您似乎没有正确创建字典:

% set k [dict create]
% dict append k fee {foo " kak"}
fee {foo " kak"}
% dict append k fee {foo " poached"}
fee {foo " kak"foo " poached"}

在这里你可以看到这可能不是你想要的。如果您允许我引用部分文档:

  

dict追加 dictionaryVariable key?string ...?

     

这会将给定字符串(或多个字符串)附加到给定键映射到给定变量中包含的字典值中的值,并将结果字典值写回该变量。 [...]

要创建具有多个深度的dict,我会使用类似的东西,如果我必须尽可能地遵循您的方法:

% set k [dict create]
% dict append k fee {foo kak}
fee {foo kak}
% dict set k fee foo "[dict get $k fee foo] poached"
fee {foo {kak poached}}

如果您要将poached附加到字符串kak的值,则需要使用dict set,这样您就可以修改任意深度字典中的值,这是dict append的缺点。现在dict get $k fee foo(与[dict get [dict get $k fee] foo]相同)将为您提供kak poached

然而,我可能会将字典创建为:

set k [dict create foo {fee {kak poached}}]

答案 1 :(得分:1)

这是另一种方法:

set k [dict create fee {foo {}}]
dict with k fee {append foo " kak"}
dict with k fee {append foo " poached"}
puts [dict get $k fee foo]

dict with命令允许您为字典成员使用变量别名(只要它们已经存在,因此在第一行中进行初始化)。可以在脚本之前给出一个或多个键,以查找要进行更改的字典级别。更改变量foo的值现在将更改fee foo中密钥k的值。

当然,你也可以这样做:

set k [dict create fee {foo {}}]
dict with k fee {
    append foo " kak"
    append foo " poached"
}
puts [dict get $k fee foo]

文档:appenddictputsset