Я не совсем уверен из вашего вопроса, говорите ли вы о массиве или значении словаря; оба являются ассоциативными картами, но массивы представляют собой наборы переменных, а словари являются значениями первого порядка.
Вы можете получить ключи массива с помощью команды 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
оптимизирован для случая, когда вносится много изменений.
person
Donal Fellows
schedule
16.12.2012