如何在TCL中创建和遍历散列哈希?

Ros*_*ers 4 tcl

如何在TCL中创建和遍历散列哈希?

如果我有以下数据:

foo = {
    a => {
        aa => { aa1 aa2 aa3 }
        ab => { ab1 ab2 ab3 }
        ac => { ac1 ac2 ac3 }
    }
    b => {
        ba => { ba1 ba2 ba3 }
        bb => { bb1 bb2 bb3 }
        bc => { bc1 bc2 bc3 }
    }
    c => {
        ca => { ca1 ca2 ca3 }
        cb => { cb1 cb2 cb3 }
        cc => { cc1 cc2 cc3 }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何通过一次插入一个叶节点数据项来创建此类哈希.就像是:

lappend foo(a)(ab)"ab1"

那么我如何迭代所有数据元素?喜欢:

foreach key in foo {
    foreach sub_key in foo($key) {
        foreach elem in foo($key)($sub_key) {
            puts "foo\($key\)\($sub_key\) is $elem"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:不幸的是,我没有访问更新的'dict'结构.

gle*_*man 8

假设您使用的是Tcl 8.5+,那么词典就是最佳选择:

简单地定义字典:

set foo {
    a {
        aa { aa1 aa2 aa3 }
        ab { ab1 ab2 ab3 }
        ac { ac1 ac2 ac3 }
    }
    b {
        ba { ba1 ba2 ba3 }
        bb { bb1 bb2 bb3 }
        bc { bc1 bc2 bc3 }
    }
    c {
        ca { ca1 ca2 ca3 }
        cb { cb1 cb2 cb3 }
        cc { cc1 cc2 cc3 }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者以编程方式定义它:

set foo [dict create]
foreach first {a b c} {
    dict update foo $first subdict {
        foreach second {a b c} {
            foreach third {1 2 3} {
                dict lappend subdict "$first$second" "$first$second$third"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出它:

dict for {key1 subdict} $foo {
    dict for {key2 list} $subdict {
        foreach elem $list {
            puts "$key1\t$key2\t$elem"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:将数组解决方案(非dict)移动到单独的答案.


gle*_*man 7

如果您没有使用Tcl 8.5,那么您可以使用数组.请注意,数组是一维的,但键是一个可用于伪造多维度的任意字符串:

array set foo {}
foreach first {a b c} {
    foreach second {a b c} {
        foreach third {1 2 3} {
            lappend foo($first,$first$second) "$first$second$third"
        }
    }
}
parray data
Run Code Online (Sandbox Code Playgroud)

并输出它 - 注意:与字典键不同,数组键是无序的:

foreach key [array names foo] {
    foreach elem $foo($key) {
        puts "$key\t$elem"
    }
}
Run Code Online (Sandbox Code Playgroud)

如果给你钥匙(例如'b'和'bc'),你可以得到这样的价值:

set key1 b
set key2 bc
foreach elem $foo($key1,$key2) {puts $elem}
Run Code Online (Sandbox Code Playgroud)