
LINUX / KOZLOV2_1
.pdfнесколько новых элементов. Функция pop удаляет из массива последний элемент и возвращает его значение.
Функции shift и unshift обрабатывают начало списка. Функция unshift удаляет первый элемент списка, после чего первую позицию занимает тот элемент, который ранее был вторым; shift добавляет в начало списка новый элемент. Аргументом функции unshift является имя массива. Эта функция возвращает значение удаленного элемента. Аргументы функции shift – имя массива и значение элемента, который вы хотите вставить. Эта функция возвращает общее число элементов на текущий момент.
Функция sort сортирует элементы массива в соответствии с используемой в системе кодовой таблицей символов (обычно это набор символов ASCII), располагая элементы в порядке возрастания.
Функция split используется для создания массива и присваивания ему значений, полученных из строки. Для обозначения в строке извлекаемых значений применяется заданный разделитель. В результате формируется список значений, которые присваиваются элементам массива. Функция split часто употребляется для обработки строк входных данных, которые уже разбиты на поля, разделенные символом, например запятой или двоеточием.
Функция grep представляет собой средство поиска в массиве или списке. Она работает так же, как и одноименная утилита в операционной системе Linux, а ее аргументами являются образец для поиска и имя массива. Функция grep возвращает значение совпавшего с образцом элемента.
В perl существуют также и ассоциативные массивы, но рамках данного пособия мы их рассматривать не будем.
Мы познакомились с языком perl очень поверхностно. Современные программисты используют средства perl в web-программировании, при управлении базами данных, создании файлов статистики, корректировке данных и т.д. Цели данной главы состояли
только в начальном знакомстве и приобретении базовых навыков работы с высокоуровневым языком perl. Программированию в этой среде посвящено немало книжных и интернет изданий, при детальном знакомстве с которыми вы самостоятельно освоите perl и сможете создавать сложные программные продукты.
151
PDF created with pdfFactory Pro trial version www.pdffactory.com
Контрольные вопросы
1.Назначение языка программирования perl.
2.Перечислите типы данных в perl.
3.Выполнение perl-сценариев из командной строки.
4.Создание сценариев perl;
5.Пример написания типового сценария.
6.Арифметические операции.
7.Операции сравнения.
8.Назначение массивов. Типы массивов. Объявление массивов.
152
PDF created with pdfFactory Pro trial version www.pdffactory.com
11. Язык программирования TCL
Наряду с популярным языком perl существует не менее известный язык tcl, использующийся во всем мире как опытными программистами, так и начинающими. Такую широкую популярность tcl приобрел благодаря большим встроенным средствам программирования, использущим относительно простой синтаксис, а также операторы и конструкции, схожие с языком C++. Данный язык нам интересен тем, что современные САПР, признанные во всем мире, пишутся в том числе с использованием кода tcl. Важно понимать код приложений и при необходимости уметь его править. Например, средства проектирования ИМС компании Synopsys. В рамках данной главы мы познакомимся с основами этого языка: с переменными tcl, выполнением арифметических действий, работой со строками, списками и массивами, а также с управляющие конструкциями.
11.1. Интерпретатор tcl
Работа с tcl может осуществляться двумя способами: либо работать в построчном режиме, т.е. с использованием интерпретатора Tcl вводить отдельные команды и получать ответ на их ввод, либо создавать полноценные файлы-сценарии (скрипты), которые выполняют не отдельную функцию, реализуемую одной командой, а целое действие, реализуемое блоком команд. В данный блок могут быть также включены команды с текстовыми комментариями, команды запроса информации у пользователя с клавиатуры, команды с арифметическими операциями, работой со строками и списками, а также некоторые другие.
Вызов командного интерпретатора tcl осуществляется путем ввода в командном приглашении Linux команды tclsh. Если вы не знаете, где находится данный интерпретатор в системе, можно воспользоваться командой which tclsh, хотя чаще всего он располагается по адресу /usr/bin/tclsh . При вводе команды tclsh появится пустое текстовое окно с приглашением в виде значка процента. В нем уже можно вводить необходимые инструкции tcl. Однако командным режимом пользуются редко, гораздо чаще используют tclsh при написании файлов-сценариев, что не требует ручного ввода команды tclsh.
Напомним, что для того чтобы указать интерпретатору shell, что вы используете оболочку, отличную от текущего интерпретатора, первой строкой в вашем скрипте вы должны указать абсолютный путь к требуемому интерпретатору. В нашем случае эта строка должна иметь следующий вид:
153
PDF created with pdfFactory Pro trial version www.pdffactory.com
#! /usr/bin/tclsh
Таким образом, в тот момент, когда вы средствами shell запустите скрипт на выполнение текущему интерпретатору (например, BASH), будет ясно, какой интерпретатор применить для трансляции нижеприведенного кода.
Расширением файлов tcl-скриптов чаще всего является комбинация букв tcl, хотя отметим, что использование расширения файлов не является обязательным и не в строгом соответствии с шаблоном. Просто по комбинации tcl программисты и пользователи эти файлы ассоциируют с tcl, не знакомясь с их содержанием, кроме того, средства рабочих столов Linux по расширению файлов проводят ассоциацию на предмет соответствия файлов тем или иным программам. Перейдем к переменным среды Tcl. Хочется также обратить внимание на то, что в отличие от среды perl, в tcl, как и в shell, не требуется ставить точку с запятой в конце каждой строки.
11.2. Переменные tcl
Переменные являются простейшими данными в этой среде. Назначение новых переменных осуществляется с помощью команды set. Синтаксис командной строки приведен ниже, где var_name – название переменной, а var_value – значение переменной. set var_name var_value
Отметим пять особенностей работы с переменными tcl:
∙тип переменной определяется «на лету» и всегда соответствует типу присваиваемого ей значения;
∙чтобы присвоить переменной значение, получаемое в результате вычисления, необходимо результат оформить определенным образом;
∙присваиваемое значение не должно иметь внутри себя пробелов или, возможно, должно быть оформлено специальным образом;
∙при первичном обращении к переменной требуется обязательно указывать присваиваемое ей значение, а при повторном обращении к переменной можно не указывать присваиваемое ей значения;
∙имя переменной необязательно должно начинаться с буквы, знака подчеркивания. Приведем примеры использования переменных. Допустим вам требуется присвоить
переменной X значение 15. Переменная от своего значения разделяется пробелом: set X 15
15
154
PDF created with pdfFactory Pro trial version www.pdffactory.com
К примеру, вам требуется присвоить переменной R значение переменной X, которое мы определили не предыдущем шаге. Для того чтобы сослаться на значение переменной, требуется совместно с переменной использовать знак доллара $:
set R $X 15
Удаление переменных осуществляется с помощью команды unset, при этом мы просто ссылаемся на имя переменной:
unset R
В tcl можно использовать стандартные средства повышения и понижения значений переменных с помощью функции incr. После требуемой функции через пробел приводится название переменной, а затем через пробел число, на которое требуется повысить исходное значение. Например, повысим значение X на 5, а затем снизим на 4: incr X 5
20
incr X -4 16
Если необходимо к переменной добавить значения нескольких других переменных, т.е. провести не сложение, а объединение информации, используется команда append.
Синтаксис append следующий: append var_name value value2 value3...
Например, объединим значения переменных a b c: set a 1
set b 2 set c 3
append a $b $c 123
Или, с помощью append объединим имя, отчество и фамилию в одну строчку. set Name Ivan
set SecondName Ivanovich set Lastname Ivanov
append Name $SecondName $Lastname Ivan Ivanovich Ivanov
Вне зависимости оттого, к какому типу принадлежит переменная, она преобразуется в
строковую переменную и происходит конкатенация полученной после преобразования строки со «строковыми» значениями аргументов.
С помощью append можно также назначать новые переменные.
155
PDF created with pdfFactory Pro trial version www.pdffactory.com
11.3. Арифметические действия с переменными в tcl
Выполнение математических действий с переменными требует использования команды expr. Синтаксис командной строки следующий: expr arg ? arg... ? arg В качестве аргументов могут использоваться как непосредственно числа, так и
числовые значения переменных. Например, expr 4+5
9
Можно также использовать разного вида скобки для эффективного использования средств tcl. Так, если вы задаете пример, где требуется определить приоритет выполняемых математических действий, то используйте круглые скобки:
expr (4+5)/9 1
Если вам требуется связать переменную с выполняемым математическим действием, то используйте квадратные скобки:
set D [expr 4+5] 9
Наконец, если вы связываете переменную с определенной текстовой или числовой последовательностью символов, то используйте фигурные скобки:
set S {expr 4+5} expr 4+5
11.4. Строки в tcl
Наряду с другими языками программирования, в tcl реализована работа со строками. Любые строковые операции осуществляются с помощью команды string, которая в свою очередь используется совместно с подкомандами. Подкоманды subcommand определяют работу string, совместно с аргументами задают конкретное действие. Формат команды string : string subcommand arg.
Приведем список возможных подкоманд:
∙определение длины строки – length;
∙определение числа занимаемых байтов значением переменной – bytelength ;
∙получение подстроки, находящейся в определенном диапазоне, – index;
∙диапазон элементов строки – range;
∙проверка на совпадение двух строк – equal;
156
PDF created with pdfFactory Pro trial version www.pdffactory.com
∙сравнение строк лексикографически – compare;
∙изменение регистра символов в строчные – tolower;
∙преобразование символов строки в прописные – toupper;
∙удаление из строки некоторых начальных или конечных символов – trim;
∙получение строки, представляющей собой несколько соединенных вместе дубликатов исходной строки – repeat;
∙удаление из строки символов, содержащихся в определенном диапазоне, а затем при необходимости замещение их на другие – replace;
∙проверка, соответствует ли строка тому или иному формату – match;
∙кодирование строки – map.
Рассмотрим примеры использования приведенных подкоманд.
Подкоманда length используется, когда требуется вернуть число символов, входящих в строку. Например, зададим переменной d в качестве значения последовательность символов asd. Ниже покажем количество символов, входящих в состав значения d. Так как d переменная, обратиться к ее значению можно через $:
string length $d 3
Схожей по смыслу является подкоманда bytelength. string bytelength $d
3
Подкоманда index совместно с командой string возвращает символ, записывают в качестве аргумента. Стоит обратить внимание, что в символов начинается с нулевого, поэтому переменная d состоит из второго символов. Например, вернем второй символ:
string index $d 2 d
номер которого tcl, как и perl, отчет нулевого, первого и
Символ d является последним символом в значении переменной d, поэтому его можно также вернуть, ссылаясь на последний символ с помощью зарезервированного аргумента end:
string index $d end d
Если нужно вернуть предпоследний символ, то используем end-1 и т.д. Если мы ссылаемся на символ, которого нет, например, указываем end-40, то при этом ничего не отобразится, даже ошибка.
157
PDF created with pdfFactory Pro trial version www.pdffactory.com
В случае, если необходимо получить не один символ, а несколько подряд, используем подкоманду range. Подкоманда range имеет два обязательных аргумента: номера первого и последнего символов, входящих в диапазон выборки. Например,
string range $d 0 end asd
string range $d 0 2 asd
string range $d 0 end asd
string range $d end-2 end asd
string range $d end-2 2 asd
Если есть необходимость сравнить две строки на совпадение, можно использовать подкоманды equal и compare. Например, введем строковые переменные a и b:
1 set a adfghkkl adfghkkl
2 set b adfgHkkl adfgHkkl
3 string equal $a $b
0
4 string equal –nocase $a $b
1
5 string equal –length 4 $a $b
1
6 set a qwerty qwerty
7 set b qwertu qwertu
8 string compare –length 5 $a $b
0
9 string compare –nocase $a $b
0
Прокомментируем приведенные строки. В первых двух строках назначаем две переменные. Строки идентичные, за исключением четвертого символа. Подкоманда equal
158
PDF created with pdfFactory Pro trial version www.pdffactory.com
имеет два ответа: 0 – несовпадение; 1 – совпадение. Сравнение по умолчанию в строке 3 показывает, что строки различаются. Однако если использовать опцию nocase (строка 4), которая не различает заглавные и строчные буквы, то строки идентичны, поэтому ответ 1. Можно также сравнивать строки на совпадение с использованием опции –length, когда строковое сравнение должно быть ограничено определенным номером символа в строке.
Встроке 5 идет сравнение строк до четвертого символа, т.е. по нулевому, первому, второму и третьему. Ответ 1, т.е. идентично. В строках 6 и 7 назначены новые строковые переменные, отличие – в пятом символе.
Спомощью опции –compare можно проводить лексикографическое сравнение, т.е. по количеству символов. В строках 8 и 9 идет сравнение строковых значений переменных с использованием подкоманды compare. При равном количестве символов двух переменных сравнение с использованием разных опций дает ответ 0.
При необходимости можно преобразовать регистр, для этого предусмотрены подкоманды tolower и totitle. Подкоманда tolower преобразует символы в строчные, т.е. делает символы «маленькими». В качестве обязательного аргумента команда string и подкоманда tolower получают ссылку на строку, подлежащую преобразованию. За обязательным аргументом могут следовать один или два необязательных аргумента, определяющих начальную и конечную позиции диапазона, в котором необходимо произвести преобразование символов. Возвращаемым значением является преобразованная строка. При этом следует отметить, что значение переменной не изменяется.
1 set a ABCDEF ABCDEF
2 string tolower $a 3 ABCdEF
3 string tolower $a 2 end ABcdef
4 string tolower $a 0 46 abcdef
5 string tolower $a 3 1 ABDCEF
Встроке 1 назначается переменная a. Если, как показано в строке 2, при подкоманде tolower следом за ссылкой на значение переменной мы указываем только один параметр, то начальная и конечная позиции преобразованного текста совпадают; если разные параметры (строка 3), то подлежит преобразованию диапазон символов. Если верхний
159
PDF created with pdfFactory Pro trial version www.pdffactory.com
предел диапазона превышает число символов в строковой переменной (строка 4), то
преобразованию подлежат все символы от символа начальной позиции до последнего символа строковой переменной. Если номер начальной позиции превышает номер конечной позиции, то ошибка не выдается, но преобразования также не происходит. Строки можно преобразовывать по форме «как в предложениях», т.е. начальный символ большой (заглавная буква). Подкоманда totitle имеет один обязательный аргумент и один необязательный. В качестве обязательного указывается номер символа, который должен быть заглавным, а в качестве необязательного указывается номер символа, который должен быть последним в диапазоне преобразованных символов. Например:
1 set d asdRTedr asdRTedr
2 string totitle $d Asdrtedr
3 string totitle $d 4 asdRTedr
Можно также дублировать исходную строковую переменную с помощью подкоманды repeat. Приведем примеры.
1 set a abc abc
2 string repeat $a 3 abcabcabc
3 string repeat $a 1 abc
В строке 2 исходную строковую переменную мы продублировали три раза, а в строке три
– только один раз. Если требуется удалить или заменить часть символов по строке, можно использовать подкоманду replace, которая имеет три обязательных аргумента и один необязательный.
Наряду с ссылкой на значение переменной нужно указывать номера начальной и конечной позиций заменяемого фрагмента. Ниже в строке 2 меняются местами два символа третьей и четвертой позиций, в строке 3 – третьей и последней (в нашем случае пятой) позиций:
1 set a qwerty
2string replace $a 3 4 qwetry
3string replace $a 3 end
160
PDF created with pdfFactory Pro trial version www.pdffactory.com