我有一个关联数组或哈希,有没有办法可以对哈希的键进行操作。
例如:假设我在Hash的Keyset中有一组键,我想在这些键上做一些操作(一些字符串操作)。
有关如何执行此操作的任何建议吗?
答案 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
针对大量字典的情况进行了优化正在做出改变。