
LINUX / KOZLOV2_1
.pdf10. Программирование в PERL
Разработчики СБИС и обычные пользователи отводят программированию в Linux большую роль. Прежде всего, это связано с частичной или полной автоматизацией выполнения проектов. Работа с прикладными программами САПР требует от
проектировщика не только специальных знаний в области проектирования СБИС и повышенного внимания, но также умения на высоком уровне работать с операционной системой Linux и ее прикладными программами.
При работе с САПР пользователь должен уметь определять и переопределять переменные окружения, которые используются в программах, назначать псевдонимы, выполнять базовые операции с файловой системой, инсталлировать и деинсталлировать программные продукты.
Некоторые из перечисленных операций требуется выполнять периодически, что не только отнимает время, но и является неэффективной работой. Поэтому снижение нагрузки пользователя частично связано с автоматизацией этих процессов. Наряду с программированием в Shell, некоторые задачи удобнее выполнять на языке PERL. PERL
(Practical Extraction and Report Language) не только является эффективным средством программирования, которое позволяет частично автоматизировать базовые функции пользователя (разработчика СБИС), но и повсеместно используется опытными программистами, так как дает возможность создавать программные приложения высокого уровня.
Язык программирования PERLl – это язык сценариев, который поначалу предназначался для формирования отчетов и обработки файлов большого объема. В настоящее время с помощью PERL можно также проверять сетевые соединения, контролировать взаимодействие между процессами и даже управлять базами данных, однако мы познакомимся с PERL лишь поверхностно.
10.1. Выполнение команд и сценариев perl
Любой оператор perl может быть запущен из командной строки. Для этого можно применить команду perl с опцией -е. Выполняемый оператор интерпретатора заключается в одинарные кавычки. В качестве примера приведем команду с оператором print, выводящую строку «Welcome, Egor!». Стоит обратить внимание на то, что строка оператора Perl завершается точкой с запятой.
141
PDF created with pdfFactory Pro trial version www.pdffactory.com
perl -e 'print "Welcome, Egor!";'
Таким образом, perl можно использовать для выполнения простых действий, подобно средствам shell и gawk.
Перед тем как перейти к более сложным операторам и конструкциям языка, определим основные правила работы с perl. Особое внимание необходимо обращать на следующие моменты. Хотя perl и является последовательным интерпретируемым языком, перед выполнением отдельных строк проверяется весь файл сценария. Сведения об ошибках отображаются на экране монитора с указанием номеров строк. К сожалению, некоторые сообщения об ошибках бывают не совсем ясными. Перечислим наиболее распространенные ошибки:
∙отсутствие точки с запятой в конце строки. Наряду с языком C++ , в программах perl в конце строки ставится точка с запятой (;), что является одним из отличий сценариев perl от сценариев shell;
∙в отличие от языка C++, управляющие структуры в perl должны включать блоки операторов, которые представляют собой их набор, заключенный в фигурные скобки { };
∙перед переменными всегда устанавливается символ $, даже если речь идет не о значении этой переменной.
Вотличие от утилиты gawk, perl-программы по умолчанию не считывают данные из стандартного ввода. Считывание обычно задается с помощью цикла while.
Вследующем примере осуществляется поиск по шаблону (ключевому слову) Egor. Содержимое файла list считывается с помощью команды more, а затем перенаправляется на perl в виде стандартного потока ввода:
more list | perl -e 'while (<STDIN>) { if (/Egor/) { print; }}'
Из командной строки операторы perl выполняются довольно редко. Обычно они помещаются в файлы сценариев, а затем уже выполняются, что напоминает shell- сценарии.
Файлы, содержащие команды perl, должны иметь общепринятое расши¬рение .pl, однако, как мы уже говорили, расширения файлов в Linux являются необязательными. Существует два способа выполнения сценариев perl с помощью команды perl. Согласно первому способу в командной строке интерпретатора shell указывается команда perl с именем сценария Perl. Затем интерпретатор perl считывает и выполняет введенные команды. В следующем примере выполняется сценарий perl под названием welcome.pl: $ perl welcome.pl
142
PDF created with pdfFactory Pro trial version www.pdffactory.com
Можно также в файл сценария perl поместить команду perl, тогда язык вызывается автоматически и выполняет введенные команды. Путь /usr/bin/perl определяет местоположение команды perl в операционной системе Linux. Команда which perl возвращает местоположение интерпретатора Perl в системе. В первой строке файла сценария следует указывать полное имя команды запуска интерпретатора, например: #!/usr/bin/perl
Сценарий может быть выполнен при условии, что для файла сценария установлено право на выполнение. Для этого необходимо применить команду chmod с параметром, например, 755:
$ chmod 755 welcome.pl
Теперь перейдем к вводу и выводу данных в perl.
10.2. Ввод и вывод в perl
Информация для преобразования может поступать в perl из разных источников: это информация по программному каналу, данные с клавиатуры или из файла. Например, если пользователю требуется ввести информацию с клавиатуры, то он должен применить дескриптор (идентификатор) ввода STDIN. Если требуется отобразить информацию на экране, то нужно применить дескриптор вывода STDOUT. Если требуется обратиться к файлу, то следует указать дескриптор файла. Дескрипторы указываются внутри знаков «больше» и «меньше».
Приведем примеры.
$_ = <STDIN>; # чтение данных из стандартного потока ввода (с клавиатуры) Переменная $_ является переменной по умолчанию, применяемой многими командами. Символ # позволяет справа от себя использовать комментарии кода, которые не выводятся на экран.
Ситуация аналогична и при выводе данных. Интерпретатор perl может выводить информацию в файлы и каналы, а также на стандартный вывод. Дескрипторы применяются для идентификации файлов и каналов как при вводе, так и при выводе данных. Дескриптор файла STDOUT идентифицирует стандартный вывод, а дескриптор файла STDERR используется для обозначения стандартного потока сообщений об ошибках.
print STDOUT "hello"; print "hello";
Приведем пример создания скрипта read_print на perl:
143
PDF created with pdfFactory Pro trial version www.pdffactory.com
#! /usr/bin/perl # обращение shell к транслятору Perl
# Программа, предназначенная для ввода пользователем с клавиатуры своего имени и отображения его на экран.
Print “Enter your name: ”; # Отображение на экране информации «Введите имя» $_ = <STDIN>; # Чтение данных из стандартного потока ввода
print "Your name is $_"; # Вывод считанных данных в качестве части строки. Выполнение скрипта read_print:
Enter your name: Egor Your name is Egor
Для ввода имени Egor со следующей строки мы можем установить в конце первой строки print до точки с запятой управляющий символ /n. Полный набор управляющих символов приведен в табл.10.1.
Для создания дескриптора файла или канала предназначен оператор open. Этот оператор имеет два аргумента: имя создаваемого дескриптора файла и имя файла. Имя дескриптора принято вводить в верхнем регистре. В качестве второго аргумента может выступать не только имя файла, но и имя переменной, содержащей название файла. Кроме того, указываются различные режимы открытия файла. По умолчанию файл открывается для чтения, но его также можно открыть для записи, для добавления данных либо для выполнения обеих операций. Синтаксис оператора open: open (дескриптор-файла,
строка-имени-файла).
В следующем примере пользователь открывает файл text с дескриптором OR: open (OR, "text");
Довольно часто имя файла является значением переменной. Для обозначения файла в этом случае употребляются символ $ и имя переменной.
144
PDF created with pdfFactory Pro trial version www.pdffactory.com
Таблица 10.1
Управляющие символы perl
Управляющий |
Описание |
символ |
|
|
|
\b |
Возврат курсора на один символ |
|
|
\cC |
Управляющая комбинация символов |
|
Control + С. Символы \cD |
|
соответствуют комбинации клавиш |
|
[Control+D] |
|
|
\f |
Переход на следующую страницу |
|
|
\e |
Символ Esc |
|
|
\n |
Переход на новую строку |
|
|
\r |
Переход в начало текущей строки |
|
(возврат каретки) |
|
|
\t |
Символ табуляции (переход к |
|
следующей позиции табуляции) |
|
|
\\ |
Символ обратной косой черты |
|
|
\" |
Кавычки |
|
|
В следующем примере имя файла text содержится в переменной filename: $filename = "text";
open (OR, $filename );
В perl файлы можно открывать в определенном режиме, для этого необходимо предварить имя файла соответствующими символами. Эти два компонента разделяются пробелом. Так, символ > употребляется, если файл должен быть открыт для записи, а символ +> – для чтения и записи.
Вследующем примере задано открытие файла text для чтения и записи: open (OR, "+> text");
Если для хранения имени файла используется переменная, то эта же переменная применяется для задания имени файла:
open (OR, "+> $filename");
Чтобы прочитать информацию из открытого файла, нужно указать его дескриптор между символами < и >.
Вследующем примере приведем код файла сценария file_read.pl, который
осуществляет поиск и отображение на экран строк по введенной пользователем строке:
145
PDF created with pdfFactory Pro trial version www.pdffactory.com
1#!/usr/bin/perl
2print "File name: \n";
3$filename = <STDIN>;
4print "Vvedite stroky: \n";
5$str = <STDIN>;
6chomp $str;
7open (OR, "$filename");
8while (<OR>)
9{
10if(/$str/)
11{
12 |
print ; |
13}
14}
15close OR;
В строке 1 ссылка на интерпретатор perl.
Во строке 2 пользователю оператора print выдается на экране монитора приглашение ввести название файла, в котором требуется осуществить поиск.
Встроке 3 с помощью дескриптора ввода с клавиатуры <STDIN> переменной $filename присваивается имя файла, введенного пользователем.
Встроке 4 пользователю предлагается ввести строку или часть строки (ключевое слово).
Встроке 5 опять ввод с клавиатуры.
Встроке 6 с помощью оператора chomp ввод данных с клавиатуры осуществляется совместно с текстовым комментарием.
Встроке 7 с помощью оператора open происходит открытие файла, название которого мы ранее ввели с клавиатуры, по умолчанию на чтение.
Далее с помощью конструкции while по дескриптору файла OR командой if проводится поиск по шаблону /$str/ на наличие искомой строки. Все найденные строки оператором print отображаются на экран. Как только содержимое файла заканчивается, с помощью оператора close закрывается файл через его дескриптор.
146
PDF created with pdfFactory Pro trial version www.pdffactory.com
10.3. Переменные и выражения perl
Переменные perl могут быть числовыми или строковыми. Тип переменной зависит от контекста, то есть от способа ее использования. Объявлять переменные не нужно. Переменная, которой присваивается числовое значение и которая применяется в арифметических операциях, является числовой. Все остальные переменные считаются строковыми. Признаком переменной в программе, как и при работе в shell, служит символ $ перед ее именем.
Переменные в perl используются в тех же операторах, что и в языке С, за исключением строковых операторов. Для сравнения строковых переменных применяются специальные операторы, те же, что и в интерпретаторе Bourne shell, а не стандартные операторы сравнения, которые употребляются только с числовыми переменными. Остальные операторы, например присваивания, используются как со строковыми, так и с числовыми переменными.
Вследующем примере переменной myname присваивается строковое значение Anton. Роль оператора присваивания играет символ = (табл. 10.2). Числовой переменной может быть присвоено числовое значение – целочисленное или с плавающей запятой. Perl поддерживает и арифметические выражения. Он допускает выполнение всех стандартных арифметических операций, производимых при работе с другими языками программирования. Чтобы сгруппировать выражение следует использовать круглые скобки (табл.10.2).
Вкачестве операндов могут выступать числовые константы, числовые пе¬ременные или другие числовые выражения.
Вследующих примерах переменной $my_num присваивается результат сложения двух чисел. Ее значение затем используется в другом арифметическом выражении, результат которого присваивается переменной $cost.
Примеры.
$my_name = "Anton"; $my_num = 56;
$cost = 87.7; $my_num = 4 + 3;
$cost = (5 * ($my_num / 3));
147
PDF created with pdfFactory Pro trial version www.pdffactory.com
Таблица 10.2
Арифметические и логические операции perl
Операция |
Описание |
|
|
* |
Умножение |
|
|
/ |
Деление |
|
|
+ |
Сложение |
|
|
- |
Вычитание |
|
|
% |
Модуль – результат представляет собой |
|
остаток от деления |
|
|
** |
Возведение в степень |
|
|
> |
Больше чем |
|
|
< |
Меньше чем |
|
|
>= |
Больше или равно |
|
|
<= |
Меньше или равно |
|
|
= = |
Равно |
|
|
!= |
Не равно |
|
|
++ |
Увеличение значения переменной на единицу |
|
|
- - |
Уменьшение значения переменной на |
|
единицу |
|
|
+= |
Увеличение на определенное значение |
|
|
-= |
Уменьшение на определенное значение |
|
|
|
10.4. Массивы и списки |
Процесс создания массива в perl состоит в том, что переменной, обозначающей массив, присваивается список значений. Значения списка заключаются в круглые скобки и разделяются запятыми. В следующем примере представлен список из пяти значений:
(3, 4, 86, 9, 7)
Чтобы присвоить значения списка элементам массива, необходимо предварить имя массива знаком @. Значения присваиваются в том порядке, в котором они представлены в списке.
@spisok = (3, 4, 86, 9, 7);
Когда массив готов, можно обращаться к его элементам по отдельности. Обратите внимание, что нумерация элементов массива начинается не с первого, а с нулевого
элемента. Массив spisok содержит пять элементов, пронумерованных от 0 до 4.
148
PDF created with pdfFactory Pro trial version www.pdffactory.com
К элементам массива можно обращаться по индексу, который принято заключать в квадратные скобки. Индекс [0] соответствует первому элементу, индекс [1] – второму, а [3] – четвертому. Для отображения значения элементов при ссылке на них требуется использовать перед названием массива символ $. Отобразим первый и последний элементы массива:
print $spisok[0] ; print $spisok[4] ;
Можно также переназначить значения элементов массива: $mynums[2] = 20;
Число элементов в массиве не ограничено. Для того чтобы добавить новый элемент, нужно просто присвоить ему значение. В результате выполнения следующей операции присваивания в массив spisok добавляется шестой элемент:
$myrmms [5] = 3;
Приведем пример очередного файла сценария, основной целью которого является выполнение арифметических действий с элементами массива:
1#!/usr/bin/perl
2print "Hello, world!\n";
3print "Vvedite 4 chisla: \n";
4$myMass[0] = <STDIN>;
5$myMass[1] = <STDIN>;
6$myMass[2] = <STDIN>;
7$myMass[3] = <STDIN>;
8$summa = $myMass[0] + $myMass[1] + $myMass[2] + $myMass[3];
9$raznost = $myMass[2] - $myMass[3];
10$mult = $myMass[0] * $myMass[1] * $myMass[2] * $myMass[3];
11$div = $myMass[1] / $myMass[2];
12print "Summa ravna: $summa \n";
13print "Raznost ravna: $raznost \n";
14print "Ymnozhenie ravno: $mult \n";
15print "Delenie ravno: $div \n";
В строках 2 и 3 отображаются приветствие пользователю и предложение ввести с клавиатуры через Enter 4 численных элемента массива myMass. Далее в строках 8 – 11 осуществляются арифметические действия: сложение, вычитание, умножение и деление соответственно. В строках 12 – 15 отображается полученный результат.
149
PDF created with pdfFactory Pro trial version www.pdffactory.com
Для упрощения кода perl массивы можно также создавать в цикле. В следующем примере создается массив myMas из 10 элементов, которые в виде столбца записываются в файл myFile, кроме того, все четные элементы записываются в файл myFile1. 1#!/usr/bin/perl
2 print "Vvedite elementi massiva: \n";
3open(EPR,"+>myFile");
4open(EPW,"+>myFile1");
5for ($i=1; $i<=10; $i++)
6{
7$myMas[$i] = <STDIN>;
8chomp(@myMas);
9print EPR $myMas[$i], "\n";
10$del = $myMas[$i] % 2;
11if ($del == 0)
12{
13 |
print EPW $myMas[$i], "\n"; |
14}
15}
16close EPR;
17close EPW;
Встроках 3 и 4 открываются на запись файлы myFile и myFile1. Далее в строке 6 оператором for в цикле ограничивается ввод 10 элементов массива. В строке 9 оператором print они поочередно заносятся в файл myFile. В строке 10 идет проверка: если остаток от деления на 2 равен нулю (т.е. число четное), то такие числа также заносятся в файл myFile1. В строках 16 и 17 файлы закрываются.
Функции обработки массивов: операции над списками. В perl существует набор функций, которые облегчают обработку массивов пользователем (разработчиком СБИС). С помощью простых команд можно выполнять базовые операции с массивами: получать список значений массива, сортировать элементы массива, последовательно обращаться к ним и т.д. Таким образом, массив можно рассматривать как список, а функции – как операции над списками.
Функция push добавляет новый элемент в конец массива, а функция pop удаляет последний элемент. Аргументами функции push являются имя массива и список значений, которые нужно добавить в массив в качестве новых элементов. Можно добавить сразу
150
PDF created with pdfFactory Pro trial version www.pdffactory.com