Уроки Tcl

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

#15: Добавление и удаление элементов списка

Список может быть полезен даже если вы только задаёте его и получаете элементы. Однако, есть набор функций, которые позволяют добавлять и удалять элементы из списка.

Вот эти команды:

concat ?арг1 арг2 ... аргN?
    Соединяет аргументы в единый список. При этом удаляются лишние пробелы. Аргументами могут быть отдельные элементы или списки, в этом случае содержимое всех списков и элементов объединяется в один список.
lappend имяСписка ?арг1 арг2 ... аргN?
  Добавляет аргументы в список имяСписка, считая каждый аргумент как элемент списка.
linsert cписок индекс арг2 ?арг2 ... аргN?
  Вставляет аргументы в список на позицию индекс и возвращает новый список. Каждый аргумент становится отдельным элементом нового списка. Если индекс меньше или равен нулю, то новые элементы вставляются в начало списка. Если индекс равен end, или больше или равен количеству элементов в списке, то новые элементы добавляются в конец списка.
lreplace список первый последний ?арг1 ... аргN?
  Возвращает новый список, где часть элементов заменена на аргументы. Индексы первый и последний указывают на элементы, которые надо заменить.Если первый индекс меньше или равен нулю, lreplace начинает заменять с первого элемента. Если первый индекс больше, чем количество элементов в списке или слово end, то lreplace работает как lappend. Если аргументы не заданы, то lreplace просто удаляет элементы, подлежащие замене.

Выполните пример, и поглядывайте на него во время прочтения оставшейся части урока.

Обратите внимание, каким способом элементы списка сгруппированы в коде примера. {в г д} в первом примере - третий элемент списка, состоящий из трёх букв, а {е {к л}} - двухэлементный список, состоящий из буквы и списка из двух букв. Все они обьединяются в один список командой list, каждый лист в строке становится отдельным элементом общего списка.

Когда строка преобразуется в список командой split, расстановка скобок не имеет значения. Чтобы интерпретатор не пытался обрабатывать фигурные скобки, перед ними добавляется обратная дробь. Строка разбивается на элементы по пробелам. Попробуйте использовать фигурные скобки как разделитель для команды split, и посмотрите, что получится.

Наконец, когда список группируется командой concat, элементы каждого списка объединяются в один общий список.

Пример:

set b [list а б {в г д} {е {к л}}]
puts "Создание списка командой list: $b\n"

set b [split "а б {в г д} {е {к л}}"]
puts "Создание списка командой split: $b\n"

set a [concat а б {в г д} {е {к л}}]
puts "Создание списка командой concat: $a\n"

lappend a {ий к лм}			;# Помните: {ий к лм} - один элемент
puts "После команды lappend: $a\n"

set b [linsert $a 3 "1 2 3"]		;# "1 2 3" - один элемент
puts "После linsert в позицию 3: $b\n"

# "АА" и "ББ" два элемента списка.
set b [lreplace $b 3 5 "АА" "ББ"]  
puts "После lreplace замены 3х элементов на 2 элемента в позиции 3: $b\n"

Следующий урок - #16: Дополнительные команды работы со списком - lsearch, lsort, lrange
Горбачев "Yurez" Юрий  
Хостинг от uCoz