Уроки Tcl
#22: Ассоциативный массив - array |
В Tcl есть три простых типа данных: список, строка, и ассоциативный массив. Ассоциативный массив - собрание элементов, аналогично списку. В списке каждый элемент имеет свою позицию, и вы можете обратиться к нему по расположению (командой lindex). В ассоциативном массиве каждый элемент данных имеет имя, как переменная, и вы можете обращаться к отдельному элементу по имени.
Элемент в ассоциативном массиве описывается в следующем формате: имяМассива(имяЭлемента). Аналогично обычным переменным, вы можете указать значение элемента командой set.
set chores(Sunday) "Вымыть машину"
set chores(Monday) "Выбросить мусор"
set chores(Tuesday) [list {Очистить холодильник} {Сходить в магазин}]
В этом уроке описаны следующие простые команды работы с массивом:
| array exists имяМассива | |
| Возвращает 1 если имяМассива - массив. Возвращает 0 если имяМассива простая переменная, процедура или вовсе не существует. | |
| array names имяМассива ?шаблон? | |
| Возвращает список индексов для ассоциативного массива имяМассива. Если задан шаблон, то будут возвращены только индексы удовлетворяющие шаблону. Поиск выполняется методом globbing, аналогично команде string match. | |
| array size имяМассива | |
| Возвращает количество элементов в массиве. | |
| array get имяМассива | |
| Возвращает список, в котором на нечетных местах (1, 3, 5 и т.д.) индексы массива, а на четных - соответствующие значения. | |
| array set имяМассива списокДанных | |
| Превращает список в ассоциативный массив. списокДаннх - список в формате, возвращаемом командой array get. На нечетных местах (1, 3, 5 и т.д.) - индексы, а на четных - значения. | |
Когда ассоциативный массив используется в команде global, то все элементы массива становятся доступны в процедуре. По этой причине рекомендуется использовать ассоциативный массив для хранения параметров для всей программы.
Этот метод упрощает разделение данных между множеством процедур, и избавляет от проблемы создания уникальных имён. Так же вам будет проще изменять программу, меньше ошибок.
Одна из самых частых ошибок программистов на Tcl, это когда они забывают указывать переменные в команде global, чтобы использовать глобальные переменные программы в процедуре. При такой ошибке Tcl молча создаёт локальную переменную с таким же именем для процедуры, но все её изменения никак не отражаются на глобальной переменной. В этом случае код не имеет синтаксических ошибок, но работает неправильно.
array set array1 [list \
{123} {Александр Антуфьев} \
{234} {Борис Бобров} \
{345} {Валерий Воронов} \
{456} {Григорий Горбачев} ]
puts "Array1 содержит [array size array1] элементов\n"
puts "Array1 содержит следующие элементы: \n [array names array1] \n"
puts "Идентификатор номер 123 соответствует элементу: $array1(123)\n"
if {[array exist array1]} {
puts "array1 - массив"
} else {
puts "array1 не массив"
}
if {[array exist array2]} {
puts "array2 - массив"
} else {
puts "array2 не массив"
}
|
| Юрий "Yurez" Горбачев |