2016-12-22 4 views
0

если я использую ключ типа int_size [1] "в tcl-массиве - я не могу получить значение с помощью« массива get array key ».ключ tcl массива с метасимволами не работает

array set mymap {} 
set key "int_size" 
set mymap($key) 100 
if {[array get mymap $key] == ""} { 
    puts "Error: $key not found" 
} else { 
    puts "Ok: $key found" 
} 

set key {int_size[1]} 
set mymap($key) 100 
if {[array get mymap $key] == ""} { 
    puts "Error: $key not found" 
} else { 
    puts "Ok: $key found" 
} 

показано ниже на выходе

Ok: int_size found 
Error: int_size[1] not found 
+0

Попробуйте сравнить с $ mymap ($ key) вместо массива get mymap $ key. –

ответ

1

Команда array get берет образец Глоб (как в string match), и [ ... ] является особенным для универсализации модели. Вы можете исправить это, добавив обратную косую черту (возможно, с string map), но она действительно очень тяжелая работа для получения большой выгоды.

Вместо этого проверьте, присутствует ли значение с использованием info exists. Это работает для всех ключей, и (начиная с 8.5 и выше) очень эффективно. Наилучшим образом, это более эффективно, чем array get во всех версиях, так как это делает линейное сканирование всего массива внутри.

if {[info exists mymap($key)]} { 
    puts "OK, $key found" 
} else { 
    puts "Error, $key absent" 
} 
0

Индекс массива всегда должен быть правильный список (он на самом деле не документированы, что путь, но это своего рода вытекает из семантики команды массива). Так как строка «int_size [1]» не является надлежащим списком, она не будет работать, если не будет принудительно с синтаксисом array (index). В случае сомнений оберните значение в [list ...], прежде чем назначать его ключевой переменной.

ETA

Советы выше является правильным и полезным, но это ответ Донал, что является наиболее актуальным. Я бы тоже упомянул об этом, кроме того, что после всех этих лет я, похоже, не могу Фрейкинг. Запомнить. Этот массив получает строку glob.

 Смежные вопросы

  • Нет связанных вопросов^_^