Расскажу немного о работе со списками.
Список - это массив элементов, нумерация в списке начинается с нуля. [center]СОЗДАНИЕ СПИСКА[/center]
Задать список просто:
Code
set list {"элемент 1" "элемент 2" "элемент 3"}
либо
Code
set list [list "элемент 1" "элемент 2" "элемент 3"]
Это создает список list с тремя элементами. Длинна списка будет равна 3. Первый элемент списка имеет индекс 0, второй - 1, третий - 2. Так же последний элемент списка имеет индекс end(см. ниже).
llength <список> - процедура возвращает длинну списка.
Code
putlog [llength $list]
В результате, в патилайне выведется 3. [center]ВЫБОРКА ДАННЫХ[/center]
lindex <список> <элемент> - это процедура позволяет выбирать нужный нам элемент из списка:
Code
putlog [lindex $list 0]
В патилайн выведет "элемент 1" (без кавычек). В процедуру lindex передается список, из которого мы выбираем элемент ( в нашем случае - $list ) и номер элемента. Напомню, что нумерация начинается с нуля. Выбрать последний элемент списка ( в нашем случае он имеет индекс 2 ), можно передав в процедуру слово "end" (без кавычек).
Code
putlog [lindex $list end]
В результате мы получим "элемент 3". lrange <список> <первый элемент> <последний элемент> - процедура позволяет выбрать диапазон элементов из списка ( от первого до последнего элемента ).
Code
putlog [lrange $list 1 end]
В результате мы получим новый список из 2х элементов списка $list - "элемент 2" и "элемент 3". В нашем случае 1 - начальный элемент, end - последний элемент списка. [center]ПОИСК ПО СПИСКУ[/center]
lsearch [ключи] <список> <шаблон> - осуществляет поиск наличия элемента в списке. Возвращает номер первого найденного элемента в списке, если существует элемент, соответствующий шаблону, если нет - возвращает -1. Ключи указывать не обязательно, по умолчанию устанавливается ключ -glob. Возможные ключи:
-glob - используются те же правила сравнения элементов с шаблоном, что и в string match
-exact - означает, что элемент списка должен быть в точности равен шаблону
-regexp - шаблон считается регулярным выражением и для сравнения используются те же правила, что и в regexp
Пример 1:
Code
putlog [lsearch $list "*элемент*"]
Ключ установлен по умолчанию в -glob, сравнение осуществляется так же, как и в string match. Под этот шаблон попадают все 3 элемента, но будет выведен только индекс первого из них - 0.
Пример 2:
Code
putlog [lsearch -exact $list "элемент 3"]
Ключ устанавливается в -exact, элемент должен быть в точности равен шаблону. В нашем случае, вернёт индекс 2 (3й элемент списка $list).
Пример 3:
Code
putlog [lsearch $list "element"]
Такого элемента в списке не существует. Возвращаемое значение будет равно -1 [center]ИЗМЕНЕНИЕ И ДОПОЛНЕНИЕ СПИСКА[/center]
linsert <список> <индекс> <элемент1> <элемент2> <элемент3> ... - эта процедура служит для вставки новых элементов в уже имеющийся список. Возвращает новый список. <список> - это список, в который мы вставляем элементы, <индекс> - перед этим индексом будут вставлены все наши элементы(если индекс 0 или меньше - вставляются в начало списка; если равен числу элементов или больше или равен end - вставляется в конец списка; если список из 3х элементов, а индекс равен 1, то все наши элементы будут вставлены между первым и вторым элементами списка), <элемент1> и т.п. - неограниченное число элементов, вставляемых в список.
Пример:
Code
set list2 [linsert $list end "элемент 4" "элемент 5"]
В результате наш старый список $list не изменится, а новый список $list2 будет состоять из 5 элементов ("элемент 1" ... "элемент 5"). lappend <список> <элемент1> <элемент2>... - процедура дополняет список элементами, дописывая их в конец. Если списка не существует - она создает новый список из этих элементов.
Code
lappend list3 "a" "b" "c"
Если список $list3 не существует - он будет создан. Если существует - три этих элемента будут дописаны в конец списка. Обратите внимание - символ $ перед list3 в процедуре lappend не нужен. Процедура lsort, позволяющая сортировать список, будет рассмотрена позже.