Уроки 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" Горбачев |