Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LabLinux / laba4_m3_iems_iems_ktni_niy16

.pdf
Скачиваний:
47
Добавлен:
27.03.2016
Размер:
297.68 Кб
Скачать

Модуль 3. Лабораторная работа №4 Программирование в среде TCL

Цель работы: на основе полученных навыков работы с командным интерпретатором BASH, языками программирования AWK и PERL овладеть навыками программирования на языке TCL.

Теоретические сведения

Язык программирования TCL представляет собой мощную гибкую универсальную высокоуровневую среду программирования, позволяющую создавать как простые программы, так и сложные функциональные пакеты моделирования. Многие современные системы автоматизированного проектирования написаны на языке TCL, в том числе, такие известные как Synopsys Sentaurus и Cadence. TCL представляет собой совокупность средств, которые позволяют с минимальными затратами усилий написать приложение, по своим пользовательским характеристикам сравнимое с достаточно большой программой на языках C/C++. Более того, язык TCL позволяет использовать написанные приложения на различных платформах: это могут быть Windows-, Unix-, Linux-платформы и некоторые другие.

Наряду с другими языками программирования высокого уровня в TCL также имеется возможность создавать и удалять переменные; выполнять математические действия с переменными; использовать специальные символы при работе с переменными; использовать разные типы данных при работе с переменными; использовать списки; сортировать списки; добавлять новые элементы в них; использовать массивы; использовать управляющие конструкции при сравнении и циклической обработке данных; имеется возможность работать с файлами, а именно читать и записывать файлы; проводить трассировку данных и много другое.

Назначение переменных командой set. Как и во многих языках программирования, в том числе, и некоторых командных интерпретаторах в TCL переменные назначаются командой set . Формат команды: set имя_переменной значение_переменной. Рассмотрим особенности этого процесса. Во-первых, тип переменной определяется «на лету» и всегда соответствует типу присваиваемого ей значения. Во-вторых, очевидно, что для того чтобы присвоить переменной значение, получаемое в результате вычисления, необходимо произвести еще какие-то действия или каким-то образом оформить присваиваемые значения. В-третьих, присваиваемое значение не должно внутри себя иметь пробелов или, возможно, должно быть оформлено специальным образом. В-четвертых, в том случае, если мы впервые обращаемся к переменной, указывать присваиваемое переменной значение обязательно. Если же мы обращаемся к переменной, значение которой уже присвоено, то можно не указывать присваиваемого ей значения, в этом случае среда возвратит то значение, которое было присвоено переменной ранее. И наконец, в пятых, интересным является то, что имя переменной не обязательно должно начинаться с буквы, знака подчеркивания и т.д. Назначим значение 5 переменной «а». Затем назначим переменной «b» значение переменной «a».

set a 5 set b $a

Удаление переменных командой unset . После использование переменной ее требуется удалить, что не заполнять память компьютера не нужными переменными. Удаление переменных осуществляется командой unset . Формат команды: unset имя_переменной(ых) . Удалим переменную «а».

unset a

Увеличение значения переменной incr . Иногда требуется повысить значение переменной, например, в цикле. Это можно выполнить с помощью команды incr . Формат команды: incr имя_переменной increment . При этом если на языке C операция инкремента означает приращение значения переменной на единицу, то в TCL значение приращения определяется в самой команде. Если приращения не указано, то по умолчанию используется единица. Повысим значение переменной «b» на 2.

incr b 2

Команда append . В том случае, если требуется провести добавление значений переменных к существующей переменной, используйте команду append . Формат команды: append имя_переменной значение_переменной значение переменной … Рассмотрим пример использования команды append .

set a 1; set b 2; set c 3 append a $b $c

123

Точка с запятой выступают в роли разделителя команд в одной строке. Также в качестве значений переменных можно использовать слова.

set name Ivan; set secondname Ivanovich; set lastname Ivanov append name $secondneme $lastname

Выполнение математических действий с переменными. Команда expr .

За именем команды могут идти сколько угодно аргументов, при этом аргументами команды могут быть как числа, так и выражения. При совершении математических действий используются круглые, квадратные и фигурные скобки. Круглые скобки используются, как и обычно, для того, чтобы указать очередность действий в математических выражениях. Фигурные скобки используются для того, чтобы объединить несколько слов, разделенных пробелом или каким-либо другим разделителем, в одно. В этом случае становится возможным, например, присваивать переменным строковые значения, содержащие в себе пробелы. Если требуется присвоить переменной какое-либо значение, вычисляемое в программе, то команду, производящую вычисление выражения, нужно заключить в квадратные скобки. Однако, если переменная заключена в фигурные скобки, то в сформированном аргументе не производятся подстановки значений переменных. Для того чтобы подстановки могли бы быть произведены, можно воспользоваться не фигурными скобками, а кавычками. Приведем примеры.

expr { 1 + 2 } 3

set a 3; set b 5 5

expr { $a + $b } 8

Использование круглых скобок expr 3 + 4 * 5

23

expr ( 3 + 4 ) * 5 35

Использование фигурных скобок set varp { varp is My Variable } varp is My Variable

set a { expr 5 + 7 } expr 5 + 7

Использование квадратных скобок set a [ expr 5 + 7 ]

12

set a 6; set b 34 34

set a { expr $a + $b } expr $a + $b

set a “expr $a + $b” expr expr $a + $b +34 set a 3

3

set a “expr $a + $b” expr 3 + 34

set b WWW WWW

set a { Please enter $b! } Please enter $b!

set a “ Please enter $b! ” Please enter WWW!

Строки. Команда string . Для использования строк в интерпретаторе TCL предусмотрена команда string , которая используется с разными подкомандами. Подкоманда определяет, что необходимо сделать команде. Затем используются непосредственно аргументы. В зависимости от функционального предназначения подкоманды условно можно разделить на несколько категорий. Формат команды string : string подкоманды аргументы .

Определение длины строки осуществляется с помощью подкоманды length, при этом в качестве аргумента команде необходимо передать ссылку на строку. Например, назначим переменной «d» значение asd и определим длину строки в символах.

set d asd

string length $d 3

Если требуется определить число занимаемых строкой байтов памяти без учета завершающего нуля (в TCL строки в общем случае нулем не завершаются, подсчитывается число символов в строке), можно использовать комбинацию string bytelength . В качестве аргумента необходимо передать ссылку на строку. Определим число занимаемых байтов значением переменной «d».

string bytelength $d

3

Получение подстроки, находящейся в определенном диапазоне. Если необходимо получить символ, находящийся в определенной позиции строки, то этот символ может быть возвращен при помощи команды string index. В качестве аргументов команде необходимо передать ссылку на строку, а в нашем случае, а также номер позиции, символ в которой необходимо получить. При этом начальному символу строки соответствует номер 0.

string index $d 1 s

string index $d 56 string index $d end d

string index $d end-2 a

string index $d end-45

В TCL также имеется возможность выводить диапазон элементов строки с помощью комбинации string range, т.е. если необходимо получить не один символ, а несколько символов, находящихся в заданном диапазоне, можно воспользоваться командой string range. В качестве аргументов необходимо указать ссылку на строку, а также индексы начального и конечного символов диапазона.

Рассмотрим пример. string range $d 0 2 asd

string range $d 0 end asd

string range $d end-2 2 asd

string range $d 0 54 asd

string range $d 1 2 sd

Индекс элемента должен находиться в диапазоне от 0 до длины строки в символах. В случае получения элементов строки, находящихся в указанном диапазоне, начальный индекс диапазона должен быть меньше конечного индекса диапазона. В случае, если конечный индекс диапазона превышает длину строки, то возвращается строка от начального индекса до конца, что, собственно, эквивалентно использованию в качестве конечного индекса диапазона слова «end».

Команда string equal. Для того чтобы определить, совпадают ли две строки, можно использовать команду string equal. У команды есть обязательные и необязательные аргументы. Обязательными аргументами являются ссылки на две сравниваемые строки. Эти ссылки должны быть последними аргументами команды. Перед ними в произвольном порядке могут следовать два необязательных аргумента, представляющие собой опции сравнения строк. Опция - nocase заставляет команду пренебречь регистром символов и сравнивать все символы так, словно они набраны на одном регистре. Опция -length, за которой должно следовать целое число, определяет, что в сравнении должны участвовать не все символы строки, а только те, индекс которых меньше указанного числа. Команда возвращает значение 1 («истина») в том случае, если строки (или их

части в случае использования опции -length) совпадают. Возвращ а е м о е з н а ч е н и е 0 («ложь») является признаком того, что строки не совпадают.

Команда string compare. Однако может возникнуть необходимость сравнить строки лексикографически и определить, какая из строк «больше», а какая «меньше». Для решения подобного рода задачи предназначена команда string compare. Эта команда получает в точности такие же аргументы, что и команда string equal. Разница между ними состоит только в том, что команда string compare может возвращать не два, а три значения. Значение -1 возвращается в том случае, когда первая строка при лексикографическом сравнении оказывается меньше второй. Значение 0 является признаком того, что строки или их начальные части (в случае использования опции -length) совпадают. И, наконец, возвращаемое значение, равное 1, говорит о том, что при лексикографическом сравнении первая строка оказалась больше второй. set a adfghkkl

adfghkkl

set b adfgHkkl string equal $a $b 0

string equal –nocase $a $b 1

string equal –length 4 $a $b 1

Set a qwerty qwerty

Set b qwertu qwertu

String compare –length 5 $a $b 0

String compare –nocase $a $b 0

Команда string tolower. Изменение регистра символов осуществляется с помощью комбинации string tolower. Данная команда требуется, чтобы текущие символы преобразовать в строчные (сделать буквы “маленькими”). В качестве обязательного аргумента команда получает ссылку на строку, подлежащую преобразованию. За обязательным аргументом могут следовать один или два необязательных аргумента, определяющие начальную и конечную позиции диапазона, в котором необходимо произвести преобразование символов. Возвращаемым значением является преобразованная строка. В случае, если указывается только один необязательный аргумент, он воспринимается как индекс символа строки, подлежащего преобразованию в другой регистр. Если указаны оба необязательных аргумента, они понимаются как границы диапазона, подлежащего преобразованию. Если конечная позиция диапазона меньше начальной позиции, никаких действий не производится. При преобразовании строки возвращается не сама строка, а копия строки, в которой и произведены необходимые преобразования. Сама строка остается неизменной. Первый аргумент в том случае, если он является единственным, определяет не начало диапазона, а индекс элемента, подлежащего преобразованию.

Команда toupper. Для преобразования символов строки в прописные (если необходимо «маленькие» буквы сделать «большими»), используется команда string

toupper. Она работает точно так же, как и команда string tolower, поэтому останавливаться на ее рассмотрении подробно нет смысла.

Команда totitle. Данная комбинация предназначена для преобразования регистра символов “Как в предложениях”. Первый символ строки или диапазона эта команда делает прописным, а остальные символы она делает строчными. Команда использует те же аргументы, что и предыдущие команды.

Рассмотрим примеры. set a ABCDEF

ABCDEF

string tolower $a 3 ABCdEF

string tolower $a 2 end ABcdef

string tolower $a 0 46 abcdef

string tolower $a 3 1 ABDCEF

set d asdRTedr asdRTedr string totitle $d Asdrtedr

string totitle $d 4 asdRtedr

Команда string trim . Данная комбинация используется, когда необходимо удалить из строки некоторые начальные или конечные символы. За обязательным аргументом, представляющим собой ссылку на строку, подлежащую преобразованию, может следовать еще один необязательный аргумент. Этот необязательный аргумент представляет собой строку, состоящую из символов, подлежащих удалению из строки. Если необязательный аргумент не указан, то будут удалены пробелы, символы табуляции, а также символы возврата строки и перевода каретки. Частными случаями команды string trim являются команды string trimleft и string trimright. Аргументы этих команд аналогичны аргументам команды string trim. Однако команда string trimleft производит удаление только начальных символов, в команде string trim-right производит удаление только конечных символов. Думаю, что более подробно объяснять работу этих команд не требуется.

Команда string repeat . Если необходимо получить строку, представляющую собой несколько соединенных вместе дубликатов исходной строки, можно использовать команду string repeat. В качестве аргументов используются ссылка на исходную строку и число, определяющее сколько раз будет повторена исходная строка. Если в качестве аргумента указан 0, то вывод значения переменной происходить не будет. Пример использования команды string repeat приведен ниже. set a abc

abc

string repeat $a 3 abcabcabc

string repeat $a 1 abc

Команда string replace . Если нужно удалить из строки символы, содержащиеся в определенном диапазоне, а затем при необходимости заменить их на другие, то для этого можно воспользоваться командой string replace. Команда имеет три обязательных аргумента и один необязательный аргумент. Обязательными аргументами являются ссылка на строку, в которой необходимо произвести изменения, а также индекс начального и конечного элементов диапазона, который будет удален и при необходимости заменен. Необязательным аргументом является ссылка на строку, которая будет вставлена на место удаленных из строки символов. Пример использования команды string replace приведен ниже.

set a qwerty

string replace $a 3 4 qwetry

string replace $a 3 end qweytr

Команда string match . Иногда необходимо проверить, соответствует ли строка тому или иному формату. К примеру, может потребоваться, чтобы даты при вводе в

поле базы данных были бы указаны в формате ДД/ММ/ГГГГ или же ДД-ММ-ГГ. Номер телефона может быть указан как 8-ККК-ННННННН или же ННН-НН-НН. Для того чтобы проверить, соответствуют ли строки определенным требованиям, используются шаблоны. Для определения соответствия строки шаблону используется команда string match. Команда использует два обязательных аргумента - ссылку на шаблон и ссылку на проверяемую строку. После команды перед обязательными аргументами может находиться необязательный аргумент - -nocase, который, заставляет проверку соответствия строки шаблону производить без учета регистра. Второй специальный символ – это '?'. Он соответствует одному любому символу. Например, если необходимо найти файлы, имя которых начинаются на «f» и заканчивается на «r», между которыми находится ровно два символа, то шаблон для поиска подобных файлов будет иметь вид «f??r.*». Если при этом определить, что расширение таких файлов должно состоять из двух символов, то в этом случае шаблон для поиска примет следующий вид: «f??r.??». Третий специальный символ, точнее, символы -это квадратные скобки. При помощи квадратных скобок можно определить последовательность символов, к которой должен принадлежать проверяемый символ. При этом можно указать как набор символов, например [rthm], так и диапазон символов, например [A-z]. Одновременно могут быть указаны несколько диапазонов, например [A-z0-9].

И, наконец, последний специальный символ - это \\. Этот символ показывает, что в проверяемой позиции должен находиться символ, непосредственно следующий за символом \\. Приведем пример по сверке нескольких строк на соответствие шаблонам. Проверим принадлежность данного номера московскому региону.

set r {[0-9]} [0-9]

set t \\8\\-\\0\\9\\5\\-$r$r$r\\-$r$r\\-$r$r \8\-\0\9\5\-[0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9] set u 8-095-456-67-90

string match $t $u 1

set u 8-222-456-67-90 string match $t $u

0

Команда string map . Данная комбинация используется, когда необходимо “закодировать” и затем “раскодировать” строку. Команда использует два обязательных и один необязательный аргумент. Обязательными аргументами являются совокупность пар «ключ-значение» и ссылка на преобразуемую строку. Необязательный аргумент должен находиться сразу же после имени строки и представляет собой опцию -nocase. Пары «ключ-значение» представляют собой заключенную в фигурные скобки последовательности заменяемых и заменяющих элементов. Следующий пример поясняет работу string map. Закодируем комбинацию букв «abctttabcttt».

string map { abc 1 ttt 2 } abctttabcttt 1212

Списки. Списки в ТCLе используются в качестве коллекций, в которых можно хранить объекты различных типов, а также осуществлять перебор всех элементов. В отличие от других языков программирования, списки в Тсlе представляют собой просто строки, разделенные пробелами. В простейшем случае список представляет собой набор элементов, разделенных между собой пробелами.

Команды llength и lindex . Любой список может быть объявлен как обычная переменная, при помощи команды set. Для того чтобы проверить создание списка, можно воспользоваться командами llength и lindex. Команда llength, получая в качестве аргумента ссылку на список, возвращает число элементов списка. Аргументами команды lindex являются ссылка на список и индекс элемента, значение которого необходимо получить. Возвращаемым значением и является значение элемента с указанным индексом. На следующем примере покажем способ объявления списка. Обращаем Ваше внимание на то, что элементы списка также как и элементы строковой переменной начинаются с нулевого.

set spisok { a b {rty} a s d {t y {d f g} } v b n m } a b {rty} a s d {t y {d f g} } v b n m

llength $spisok 11

lindex $spisok 2 r t y

lindex $spisok 6 t y { d f y }

Кроме команды set, списки также можно назначать командами concat и list. Рассмотрим работу этих команд на примере.

concat a b c { d e { f } } { g h } a b c d e { f } g h

list a b c { d e { f } } { g h } a b c { d e { f } } { g h }

Команда concat может иметь несколько необязательных аргументов. Если команда concat вызывается с аргументами, то она удаляет лидирующие и завершающие пробелы у каждого элемента, после чего объединяет элементы в единый список. Данная команда «теряет один уровень вложений», объединяя элементы списка между собой. Если же команда concat вызывается без аргументов, то результатом работы команды будет пустая строка. Команда list имеет те же аргументы, но в отличие от команды concat она при создании списков не теряет «вложений».

Команда linsert предназначена для вставки в список нового элемента или элементов. Ее аргументами являются ссылка на список, в который будут вставлены

элементы, индекс элемента, перед которым будут вставлены новые элементы, и один или более новых элементов списка. В том случае, если в качестве ссылки на список команде передать несуществующую переменную, то эта переменная будет вставлена в созданную временную копию списка качестве первого аргумента. Примеры использования команды linsert приведены ниже.

set a { A B C D } linsert $a 2 X R T A B C X R T D

Команда lappend предназначена для добавления в список новых элементов. В отличие от команды linsert, команда lappend добавляет элементы в конец списка. В некотором смысле она напоминает команду append, но элементы в список добавляются не единым целым, а по отдельности, создавая список. В силу того, что отдельная переменная может считаться частным случаем списка, можно сказать, что команда lappend предназначена также для преобразования переменной в список. Обязательным аргументом команды является ссылка на список или переменную, которая будет преобразована в список, а необязательными аргументами являются добавляемые в список элементы. Пример использования команды lappend приведен ниже.

lappend TYPE set TYPE

lappend TYPE 1 2 3 4

Команда lreplace предназначена для удаления элементов из списка и замены их на новые элементы. Эту команду в зависимости от числа аргументов можно рассматривать как состоящую из двух частей. Обязательными аргументами команды являются ссылка на существующий список и индексы начального и конечного элементов того диапазона, который необходимо удалить. В случае, если при вызове команды будут указаны только три обязательных аргумента, то элементы, попадающие в указанный диапазон, будут удалены. В том случае, если в качестве начального индекса диапазона будет указано отрицательное число, оно будет заменено на 0. Если в качестве конечного элемента диапазона будет указано число, превышающее индекс последнего элемента списка, оно будет заменено на индекс последнего элемента списка. Индекс последнего элемента диапазона не может быть меньше индекса начального элемента. В случае их равенства будет удален только тот элемент списка, индекс которого равен указанному. удаление элементов - это только половина тех возможностей, которыми обладает команда lreplace. Помимо удаления элементов из списка, команда lreplace может также осуществлять замену удаленных элементов на новые. Для того чтобы осуществить такую замену, достаточно указать в качестве необязательных аргументов те элементы, которые необходимо вставить в список.

set a { 1 2 3 4 5 6 7 8 9 } 1 2 3 4 5 6 7 8 9 lreplace $a 4 5

1 2 3 4 7 8 9 lreplace $a -4 4 6 7 8 9

lreplace $a 2 56 1 2

lreplace $a 2 end 1 2

lreplace $a 2 2 1 2 4 5 6 7 8 9 lreplace $a 4 1 1 2 3 4 5 6 7 8 9 set a

1 2 3 4 5 6 7 8 9 lreplace $a 4 5 { a b c d } 1 2 3 4 { a b c d } 7 8 9 set a

1 2 3 4 5 6 7 8 9 lreplace $a 1 2 a b c d 1 a b c d 4 5 6 7 8 9

Команда lrange . Тогда, когда необходимо выделить из списка его часть (получить «подсписок»), можно использовать команду lrange. Эта команда, получив в качестве аргументов индексы начального и конечного элементов «подсписка», возвращает новый список, состоящий из элементов, включенных в диапазон. Если начальный и конечный элементы поменять местами, то вывода информации по списку не будет. Приведем примеры.

set r { 1 2 3 4 5 6 7 } lrange $r 2 4

3 4 5

lrange $r 4 2 lrange $r 4 end 5 6 7

Команда lsearch . Иногда требуется производить поиск в списке. Для того, чтобы осуществить поиск можно воспользоваться командой lsearch . Данная команда позволяет производить поиск элемента, точно совпадающего с указанным значением. Она может искать элемент, соответствующий регулярному значению. У команды lsearch есть два обязательных аргумента. Первым обязательным аргументом является, естественно, ссылка на список, в котором будет производиться поиск. Вторым обязательным аргументом является искомое значение. Есть и третий аргумент, который должен располагаться между командой и обязательными аргументами и может принимать следующие значения:

-exactзначение элемента должно в точности соответствовать искомому значению;

-glob - соответствие значения элемента искомому значению определяется по тем же правилам, по которым определяется соответствие строки шаблону, искомое значение должно представлять собой шаблон;

- regexp - искомое значение представляет собой регулярное выражение, которому должно соответствовать значение элементов списка.

Вслучае, если необязательный аргумент не указан, считается, что необязательный аргумент принимает значение «glob». Возвращаемым значением является либо индекс первого соответствующего искомому значению элемента, либо -1. Возвращенное значение -1 говорит о том, что ни одного элемента, соответствующего искомому значению, в списке не найдено. Приведем примеры использования команды lsearch . set a { aaa aaaa bbbb }

lsearch $a aaa 0

Соседние файлы в папке LabLinux