Уроки Tcl

Начало Уроки Tk Файлы
Статьи Уроки Tcl Гостевая книга
Предыдущий урок - #21: Использование регулярных выражений

#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 не массив"
}

Следующий урок - #23: Движение по массиву
Юрий "Yurez" Горбачев  
Хостинг от uCoz