Как выполнять строковые операции над ключом ассоциативного массива в TCL

У меня есть ассоциативный массив или хеш, есть ли способ, которым я могу манипулировать ключом хеша.

Например: допустим, у меня есть набор ключей в наборе ключей Hash, я хочу выполнить некоторые операции (некоторые манипуляции со строками) с этими ключами.

Любые предложения о том, как это сделать?


person user1270123    schedule 15.12.2012    source источник


Ответы (2)


Используйте array names myarray для получения списка всех ключей, затем вы можете выполнять любые манипуляции со строками по своему усмотрению.

person Israel Unterman    schedule 15.12.2012

Я не совсем уверен из вашего вопроса, говорите ли вы о массиве или значении словаря; оба являются ассоциативными картами, но массивы представляют собой наборы переменных, а словари являются значениями первого порядка.

Вы можете получить ключи массива с помощью команды 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