如何在TCL中的关联数组键上执行字符串操作

时间:2012-12-15 22:38:03

标签: arrays hashmap tcl

我有一个关联数组或哈希,有没有办法可以对哈希的键进行操作。

例如:假设我在Hash的Keyset中有一组键,我想在这些键上做一些操作(一些字符串操作)。

有关如何执行此操作的任何建议吗?

2 个答案:

答案 0 :(得分:2)

使用array names myarray检索所有键的列表,然后您可以根据需要对其进行任何字符串操作

答案 1 :(得分:0)

我不确定你的问题是你在谈论数组还是字典值;两者都是关联映射,但数组是变量的集合,字典是一阶值。

您可以使用array names命令获取数组的键,使用dict keys获取字典:

# Note, access with*out* $varname
set keys [array names theArray]
# Note, access *with* $varname
set keys [dict keys $theDict]

在这两种情况下,keys变量将保留一个正常的Tcl字符串列表,您可以以任何方式操作它们。但是,这些更改并没有反映出它们来自何处(因为这不是Tcl的值语义如何工作,并且在实际代码中会非常混乱)。要更改数组或字典中条目的键,您必须删除旧键并插入新键。这将(可能)改变迭代顺序。

set newKey [someProcessing $oldKey]
if {$newKey ne $oldKey} {   # An important check...
    set theArray($newKey) $theArray($oldKey)
    unset theArray($oldKey)
}
set newKey [someProcessing $oldKey]
if {$newKey ne $oldKey} {
    dict set theDict $newKey [dict get $theDict $oldKey]
    dict unset theDict $oldKey
}

从Tcl 8.6.0开始您还可以使用dict map对词典进行此类更改:

set theDict [dict map {key value} $theDict {
    if {[wantToChange $key]} {
        set key [someProcessing $key]
    }
    # Tricky point: the last command in the sub-script needs to produce the
    # value of the key-value mapping. We're not changing it so we use an empty
    # mapping. This is one of the many ways to do that:
    set value
}]

如果要更改大字典中的几个键,使用前面所述的dict set / dict unset会更有效:dict map针对大量字典的情况进行了优化正在做出改变。