
- •Изучение команд командного интерпретатора bash в ос linux
- •Лабораторная работа №1 Изучение команд командного интерпретатора bash в ос Linux
- •Теоретические сведения
- •Контрольные вопросы
- •Пример выполнения работы
- •Порядок выполнения работы
- •Лабораторное задание с вариантами
- •Назначение прав доступа на объекты
- •Контрольные вопросы
- •Пример выполнения работы
- •Порядок выполнения работы
- •Лабораторное задание с вариантами
- •Форма предоставления отчета
- •Поиск и сортировка данных в ос linux
- •Контрольные вопросы
- •Пример выполнения работы
- •Порядок выполнения работы
- •Лабораторное задание с вариантами
- •Форма предоставления отчета
- •Архиворование данных и управление системными процессами
- •Контрольные вопросы
- •Пример выполнения работы
- •Порядок выполнения работы
- •Лабораторное задание с вариантами
- •Форма предоставления отчета
- •Программирование в shell
- •If команда Linux then
- •Контрольные вопросы
- •Пример выполнения работы
- •Порядок выполнения работы
- •Лабораторное задание с вариантами
- •Форма предоставления отчета
- •Программирование в среде gawk
- •Контрольные вопросы
- •Пример выполнения работы
- •Порядок выполнения работы
- •Лабораторное задание
- •Форма предоставления отчета
- •Программирование в среде perl
- •Контрольные вопросы
- •Пример выполнения работы
- •Порядок выполнения работы
- •Лабораторное задание с вариантами
- •Форма предоставления отчета
- •Программирование в среде tcl
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Порядок выполнения работы
- •Лабораторное задание с вариантами
- •Форма предоставления отчета
- •Требования к отчету
- •Литература:
Программирование в среде perl
|
ОПИСАНИЕ СОСТАВИЛ: КОЗЛОВ А.В. |
МОСКВА 2007
Лабораторный практикум по курсу: “Операционная система Red Hat Linux”
Лабораторная работа №7
Программирование в среде PERL
Цель работы: имея начальные навыки программирования в SHELL и GAWK, получить начальные навыки программирования в среде PERL .
Теоретические сведения
Разработчики СБИС и обычные пользователи отводят программированию в Linux большую роль. Это связано, прежде всего, с частичной или полной автоматизацией выполнения проектов. Кроме того, работа с прикладными программами САПР требует от проектировщика не только специальных знаний в области проектирования СБИС, повышенного внимания, но также умения на высоком уровне работать с операционной системой RHEL и ее прикладными программами. При работе с САПР пользователь должен уметь определять и переопределять переменные окружения, которые используются в программах, назначать псевдонимы, выполнять базовые операции с файловой системой и много, уметь инсталлировать и деинсталлировать отдельные программное продукты, а также уметь выполнять много другое. Некоторые из перечисленных операций требуется выполнять систематически, что не только отнимает время, но также является неэффективной работой. Поэтому снижение нагрузки пользователя связано автоматизацией этих процессов.
В данной лабораторной работе мы познакомимся с новой средой программирования – PERL. PERL является не только эффективным средством программирования, которое позволяет частично автоматизировать базовые функции пользователя (разработчика СБИС), он также повсеместно используется опытными программистами, так как дает возможность создавать программные приложения высокого уровня.
Язык программирования Perl (Practical Extraction and Report Language) - это язык сценариев, который изначально предназначался для формирования отчетов и обработки файлов большого объема. Этот язык реализован в виде ядра, к которому легко добавлять новые функции. За последние годы возможности языка были значительно расширены. В настоящее время с помощью Perl можно проверять сетевые соединения, контролировать взаимодействие между процессами и даже управлять базами данных.
Выполнение Perl-сценариев из командной строки. Любой оператор Perl может быть вызван из командной строки. С этой целью применяется команда perl с опцией -е. Выполняемый оператор интерпретатора заключается в одинарные кавычки. В качестве примера приведена команда с оператором print, выводящая строку «hello». Обратите внимание на то, что строка оператора Perl завершается точкой с запятой.
Perl -e 'print "hello";'
Таким образом, Perl можно использовать для выполнения простых действий, подобно однострочным командам gawk. В отличие от утилиты gawk, Perl-программы по умолчанию не считывают данные из стандартного ввода. Считывание обычно задается с помощью цикла while. В следующем примере осуществляется поиск по шаблону «Dickens». Содержимое файла books считывается с помощью команды cat, а затем перенаправляется команде perl в виде стандартного потока ввода.
cat books [ perl -e 'while (<STDIN>) { if (/Dickens/) { print; }}'
Из командной строки операторы Perl выполняются довольно редко. Обычно они помещаются в файлы сценариев, а затем уже выполняются, что напоминает shell-сценарии.
Сценарии Perl. Обычно операторы Perl помещаются в файл, а затем считываются и выполняются с помощью команды perl. Файлы, содержащие команды Perl, должны иметь расширение .pl. Существует два способа выполнения сценариев Perl с помощью команды perl. Согласно первому способу в командной строке интерпретатора shell указывается команда perl с именем сценария Perl. Затем интерпретатор Perl считывает и выполняет введенные команды. В следующем примере выполняется сценарий Perl под названием hello.pl:
$ perl hello.pl
Теперь рассмотрим второй способ. В файл сценария Perl помещается команда perl. В этом случае автоматически вызывается интерпретатор Perl, выполняющий введенные команды. Путь /usr/bin/perl определяет местоположение команды perl в системе Open-Linux. В других системах команда perl может находиться в каталоге /usr/local/bin. Команда which perl возвращает местоположение интерпретатора Perl в системе. В первой строке файла сценария следует указывать полное имя команды запуска интерпретатора, например:
#!/usr/bin/perl
Сценарий может быть выполнен при условии, что для его файла установлено право на выполнение. Для этого необходимо применить команду chmod с параметром 755. Для каждого сценария эта операция производится только один раз. Если команда perl активизируется из командной строки (как указывалось ранее), то изменять права доступа к файлу не нужно. В следующем примере задаются права на выполнение сценария hello.pl.
$ chmod 755 hello.pl
Как и в языке программирования С, в Perl-программе команды принято завершать точкой с запятой. Сходство с С проявляется и в том, что в Perl употребляются те же символы перехода на новую строку, \n, и табуляции, \t (табл. 1). Строки комментариев начинаются с символа #.
Таблица 1 – Управляющие символы Perl
Управляющий символ |
Описание символа |
\а |
Подача звукового сигнала |
\b |
Возврат курсора на один символ |
\cC |
Управляющая комбинация символов Control + С. Символы \cD соответствуют комбинации клавиш [Control+D] |
\f |
Переход на следующую страницу |
\e |
Символ Esc |
\n |
Переход на новую строку |
\r |
Переход в начало текущей строки (возврат каретки) |
\t |
Символ табуляции (переход к следующей позиции табуляции) |
\\ |
Символ обратной косой черты |
\" |
Кавычки |
\uC |
Переводит символ С в верхний регистр |
\lC |
Переводит символ С в нижний регистр |
\Lтекст\E |
Переводит все символы текста, находящиеся между парами символов \L и \.Е, в нижний регистр |
\Uтекст\E |
Переводит все символы текста, содержащиеся между парами символов \L и \Е, в верхний регистр |
Ниже приведен пример сценария Perl. Этот сценарий выводит слово «hello», а затем осуществляет переход на новую строку. Обратите внимание на то, что в первой строке производится вызов команды perl:
helloprg
#!/usr/bin/perl
print "hello \n"
$ helloprg
hello
Хотя Perl и является интерпретируемым языком, перед выполнением проверяется весь сценарий Perl. Сведения об ошибках любого рода отображаются на экране с указанием номеров соответствующих строк. Многие сообщения об ошибках бывают недостаточно ясными. Ниже перечислены наиболее распространенные ошибки:
Одной из самых распространенных ошибок является отсутствие точки с запятой в конце строки. Операторы Perl похожи на команды интерпретатора shell, при вводе которых точка с запятой в конце строк не употребляется, поэтому в сценариях Perl легко забыть об этом знаке.
Управляющие структуры должны включать блоки операторов; в интерпретаторе Perl не допускается применение одинарных операторов, как в языке С. Блок представляет собой набор операторов, заключенных в фигурные скобки { }.
Переменным всегда должен предшествовать символ $. Это существенное отличие от синтаксиса языков gawk и С.
Модули Perl. Фрагменты программы на Perl можно поместить в отдельные файлы, а затем использовать в основной программе, указывая имена файлов в операторе use. Такие файлы имеют расширение .pm и называются пакетами (packages) либо модулями (modules). Чаще всего в модуль помещают набор операторов, предназначенный для решения некоторой задачи, например для обработки файла либо поиска текста. Стандартный набор модулей и пакетов Perl находится в каталоге /usr/lib/perl5. На man-странице perlmod подробно рассматриваются пакеты и модули Perl, в том числе и динамически загружаемые модули. Следующий оператор языка Perl задает использование модуля fmd.pm, который содержит программу, аналогичную shell-команде find. Эта команда служит для выполнения поиска в каталогах.
use /usr/lib/perl5/File/find.pm;
Для использования модуля в составе сценария Perl следует ввести ключевое слово use, а затем указать полное имя модуля. Имя модуля состоит из двух частей, разделенных двумя символами двоеточия. В левой части указывается имя категории модуля, а в правой — собственно имя. Например, имя модуля, предназначенного для выполнения шифрования с помощью шифра Блоуфиш (Blowfish), имеет вид Crypt::Blowfish. Фактически эта запись служит указанием каталога, где находится модуль (в данном случае Crypt), и имени файла модуля — Blowfish.pm. Применить этот модуль в сценарии позволит следующая строка:
use Crypt::Blowfish;
Из Internet загружается файл с исходным кодом модуля. После загрузки исходный код следует сначала скомпилировать, а затем инсталлировать. Также можно воспользоваться сценарием CPAN, который инсталлируется при установке Perl и обеспечивает автоматический доступ к серверам CPAN, а также нахождение, загрузку и инсталляцию модуля Perl в вашей системе. Для выполнения всех перечисленных действий достаточно ввести одну команду, например:
perl -MCPAN -е shell
Ввод и вывод в Perl. Данные для сценария Perl могут поступать из различных источников; файлов, потока стандартного ввода и каналов. Поэтому в программе необходимо идентифицировать источник входной информации. Это означает, что, в отличие от языка gawk и подобно shell-программе, сценарий Perl должен иметь точные указания относительно считывания вводимой информации. Ее источник точно определяется с помощью дескриптора файла — имени, которым этот источник, например файл на диске, обозначается в программах. В Perl заранее заданы дескрипторы файлов для стандартных потоков ввода и вывода, а также для стандартного потока ошибок. Для стандартного ввода используется дескриптор файла STDIN.
Ситуация аналогична и при выводе данных. Интерпретатор Perl может выводить информацию в файлы и каналы, а также на стандартный вывод. Дескрипторы применяются для идентификации файлов и каналов как при вводе, так и при выводе данных. Дескриптор файла STDOUT идентифицирует стандартный вывод, а дескриптор файла STDERR используется для обозначения стандартного потока сообщений об ошибках. Сначала рассмотрим, как Perl использует стандартный ввод и вывод данных, а затем обсудим методы выполнения операций с определенными файлами.
Perl может считывать данные со стандартного ввода либо из любого указанного файла. Команда чтения входной информации состоит из символов «меньше чем» (<) и «больше чем» (>). Чтобы обеспечить чтение информации из файла, между этими символами помещается имя дескриптора файла — <MYFILE>. Для считывания данных со стандартного ввода достаточно воспользоваться дескриптором файла STDIN, который действует подобно команде read оболочки BASH shell.
<STDIN>
Чтобы воспользоваться данными, считанными с помощью оператора <STDIN>, следует присвоить их переменной. Можно обратиться к переменной, определенной пользователем, либо к переменной $_, заданной по умолчанию, как показано в следующем примере. У многих команд значением по умолчанию является значение переменной $_. Так, если для команды print не указаны аргументы, выводу подлежит значение переменной $_, При использовании команды chomp без аргументов из значения переменной $_ удаляется конечный символ новой строки. Представленный ниже сценарий туread иллюстрирует применение переменной $_ вместе со стандартным потоком ввода.
myread
#! /usr/bin/perl
# Программа, предназначенная для чтения и отображения данных, введенных с клавиатуры.
$_ = <STDIN>; # Чтение данных из стандартного потока ввода
print "This is what I entered: $_"; # Вывод считанных данных в качестве части строки.
$ royread
larisa and aleina
This is what I entered: larisa and aleina
Оператор print можно применять для записи данных в файл или в стандартный поток вывода. Имена дескрипторов файлов указываются после ключевого слова print перед выводимыми данными. Если дескрипторы файлов не заданы, оператор print помещает данные в стандартный поток вывода. В следующих двух примерах строка «hello» передается на стандартное устройство вывода. Дескриптор файла для стандартного вывода — STDOUT. При отсутствии аргумента оператор print выводит данные, которые считаны из стандартного ввода.
print STDOUT "hello";
print "hello";
Дескрипторы файлов Perl. Для создания дескриптора файла или канала предназначен оператор open. Этот оператор имеет два аргумента: имя создаваемого дескриптора файла и имя файла. Имя дескриптора принято вводить в верхнем регистре. В качестве второго аргумента может выступать не только имя файла, но и имя переменной, содержащей название файла. Также указываются различные режимы открытия файла. По умолчанию файл открывается для чтения, но его также можно открыть для записи, для добавления данных либо для выполнения обеих операций. Ниже приведен пример синтаксиса оператора open:
open (дескриптор-файла, строка-имени-файла);
В следующем примере пользователь открывает файл reports с дескриптором REPS:
open (REPS, "reports");
Довольно часто имя файла является значением переменной. Для обозначения файла в этом случае употребляются символ $ и имя переменной. В следующем примере имя файла «reports» содержится в переменной filen:
$filen = "reports";
open (REPS, $filen );
Чтобы открыть файл в определенном режиме, необходимо предварить имя файла соответствующими символами. Эти два компонента разделяются пробелом. Так, символ > употребляется, если файл должен быть открыт для записи, а символ +> — для чтения и записи. В следующем примере задано открытие файла reports для чтения и записи.
open (REPS, "+> reports");
Если для хранения имени файла используется переменная, то эта же переменная применяется для задания имени файла, как показано ниже:
open (REPS, "+> $filen");
Чтобы прочитать информацию из открытого файла, нужно указать его дескриптор между символами < и >. Дескриптор <REPS> употребляется для считывания строки из файла reports. Программа myreport открывает файл reports и выводит его содержимое на экран.
myreport.pl
#!/usr/bin/perl
# Программа чтения строк из файла reports и вывода их на экран
open(REPS, "<reports"); t Открытие файла reports только для чтения
while ($ldat = <REPS>) f Прочитать строку из файла reports
{
print $ldat; # Вывести последнюю из прочитанных строк на экран
}
close REPS; # Закрыть файл
Интерпретатор Perl располагает полным набором встроенных операторов, предназначенных для работы с каталогами. По принципам работы эти операторы напоминают файловые функции. Оператор opendir выполняет открытие каталога, это действие напоминает открытие файла. Каталогу назначается его дескриптор. Оператор readdir считывает первый элемент каталога, другими словами, он возвращает имена файлов и каталогов, находящихся в данном каталоге. Оператор closedir закрывает каталог, оператор chdir позволяет перейти в другой каталог, оператор mkdir предназначен для создания каталогов, а посредством оператора rmdir осуществляется удаление каталогов.
Переменные и выражения Perl. Переменные Perl могут быть числовыми или строковыми. Тип переменной зависит от контекста, то есть от способа ее использования. Объявлять переменные не нужно. Переменная, которой присваивается числовое значение и которая применяется в арифметических операциях, является числовой. Все остальные переменные считаются строковыми. Признаком переменной в программе, как и при работе в shell, служит символ $ перед ее именем.
Переменные в Perl используются в тех же операторах, что и в языке С, за исключением строковых операторов. Для сравнения строковых переменных применяются специальные операторы, те же, что и в интерпретаторе Bourne shell, а не стандартные операторы сравнения, которые употребляются только с числовыми переменными. Остальные операторы, например присваивания, используются как со строковыми, так и с числовыми переменными. В следующем примере переменной myname присваивается строковое значение «Larisa». Роль оператора присваивания играет символ = (табл. 3).
$myname = "Larisa";
Числовой переменной может быть присвоено числовое значение — целочисленное или с плавающей запятой. Все значения с плавающей запятой в языке Perl являются числами с двойной точностью.
$mynum = 45;
$price = 54.72;
Perl поддерживает и арифметические выражения. Он допускает выполнение всех стандартных арифметических операций, производимых при работе с другими языками программирования. Для группировки выражений надлежит употреблять круглые скобки (табл. 3). В качестве операндов могут выступать числовые константы, числовые переменные или другие числовые выражения. В следующих примерах переменной $mynum присваивается результат сложения двух чисел. Ее значение затем используется в другом арифметическом выражении, результат которого присваивается переменной $price.
$mynum = 3 + 6;
$price = (5 * ($num / 3);
Язык программирования Perl в полной мере поддерживает набор операций присваивания, которые используются в процессе работы с языками gawk и С. Операции ++ и — выполняют инкремент и декремент содержимого переменной. Операция += увеличивает, а операция -= уменьшает Значение переменной. Например, оператор i++ эквивалентен оператору i = i + 1, а оператор i += 5 соответствует i = i + 5. Операция инкремента широко применяется в циклах.
Не обязательно включать в строку значение, можно поместить в нее имя соответствующей переменной. В следующем примере значением переменной $nameinfo является строка «My name is Larisa \n»:
print "The number of items is $mynum \n"
$nameinfo = "My name is $myname \n"
Арифметическая операция |
Описание |
* |
Умножение |
/ |
Деление |
+ |
Сложение |
- |
Вычитание |
% |
Модуль – результат представляет собой остаток от деления |
** |
Возведение в степень |
Операции сравнения |
Описание |
> |
Больше чем |
< |
Меньше чем |
>= |
Больше или равно |
<= |
Меньше или равно |
= = |
Равно |
!= |
Не равно |
Операции инкремента и декремента |
Описание |
++ |
Увеличение значения переменной на единицу |
- - |
Уменьшение значения переменной на единицу |
Операции арифметического присваивания |
Описание |
+= |
Увеличение на определенное значение |
-= |
Уменьшение на определенное значение |
Предположим, требуется, чтобы значением переменной стали данные, считанные из файла. Для этого нужно присвоить ей результат операции чтения. В следующем примере данные, считанные со стандартного ввода, присваиваются переменной $mydata:
$mydata = <STDIN>;
При считывании данных с клавиатуры во входную строку попадает и символ возврата . каретки. Возможно, вы не захотите, чтобы этот символ присутствовал в значении, присваиваемом переменной. Исключить его позволяет команда chomp, которая удаляет последний символ в строке, chomp $myinput. В следующем примере пользователь вводит свое имя, которое становится значением переменной $myname. Содержимое переменной $myname впоследствии выводится как часть строки. Прежде чем значение переменной $myname будет использовано в другой строке, из нее с помощью команды chomp удаляется символ возврата каретки.
readname.pl
#!/usr/bin/perl
$myname = <STDIN>;
chomp $myname;
print "$myname .just ran this program\n";
$ myread.pl
larisa Petersen
larisa Petersen just ran this program
Массивы и списки. Прооцесс создания массива в Perl состоит в том, что переменной, обозначающей массив, присваивается список значений. В чем специфика этого списка в Perl? Значения заключаются в круглые скобки и разделяются запятыми. В следующем примере представлен список из четырех значений:
(23, 41, 92, 7)
Чтобы присвоить значения списка элементам массива, необходимо предварить имя массива знаком @. Значения присваиваются в том порядке, в котором они представлены в списке.
@mynums = (23, 41, 92, 7);
Когда массив готов, можно обращаться к его элементам по отдельности. Нумерация элементов массива начинается с 0, а не с 1. Массив mynums содержит четыре элемента, пронумерованных от 0 до 3. К элементам массива можно обращаться по индексу, который принято заключать в квадратные скобки. Индекс [0] соответствует первому элементу, а [2] — третьему. В следующем примере выводятся значения первого и четвертого элементов. Заметьте, что перед названием массива стоит символ $.
print $mynums[0] ;
print $mynums[2] ;
Любому элементу можно присвоить новое значение. Обратите внимание: перед отдельным элементом массива ставится знак $, а не @. Знак @ служит для обозначения всего массива в целом и употребляется в процессе присвоения ему списков значений. Знак $ следует рассматривать как обозначение конкретного элемента, который по сути является переменной.
$mynums[2] = 40;
Число элементов в массиве не ограничено. Для того чтобы добавить новый элемент, нужно просто присвоить ему значение. В результате выполнения следующей операции присваивания в массив mynums добавляется пятый элемент.
$myrmms [4] = 63;
С каждым массивом связана специальная переменная, обозначаемая следующим образом: # имя_массива. Значением этой переменной является текущее число элементов массива. Например, значение переменной #mynums — это число элементов в массиве mynums. В следующем примере задан вывод на экран количества элементов этого массива.
print "$#mynums";
Значения в списке, присваиваемые элементам массива, не обязательно должны иметь один тип. Это могут быть числа, строки и даже переменные. В этом случае элементы массива также будут разного типа (числовыми, строковыми и т. п.). В следующем примере элементам массива myvar присваиваются разнотипные значения.
@myvar = ("aleina", 11, 4.5, "a new car");
Для того чтобы команда оперировала всеми элементами массива, нужно указать имя массива с префиксом @. В следующем примере на экран выводятся все значения массива mynums:
print $mynums;
Символ @ употребляется вместо символа $, потому что массив не является простой переменной. Он содержит список значений, а в качестве переменных выступают отдельные элементы массива. Символ @ употребляется и во время присваивания значений одного массива другому. В следующем примере значения всех элементов массива mynums присваиваются соответствующим элементам массива newnums. Обратите внимание на то, что символ @ указан и перед именем массива mynums. Можно считать, что выражение @mynums преобразовывается в список значений массива mynums, после чего значения списка присваиваются элементам массива newnums.
@newnums = $mynums;
Список значений массива может использоваться в строке символов, как и значение переменной. В следующем примере значения элементов массива встраиваются в строку, которая затем присваивается переменной myreport. Заметьте: в качестве префикса в имени массива @mynums употребляется знак @.
$myreport = "Here are the numbers I have: @mynums \n";
print $myreport;
Переменные, выступающие в качестве элементов массива, обозначаются с помощью индекса и символа $. В следующем примере используется значение третьего элемента массива mynums:
$myelement= "This is the value of the third element: $mynums[2] \n";
print $myelement;
Функции обработки массивов: операции над списками. В Perl существует набор функций, которые облегчают обработку массивов пользователем. С помощью простых команд можно выполнять базовые операции с массивами: получать список значений массива, сортировать элементы массива, последовательно обращаться к ним и т. д. Таким образом, массив можно рассматривать как список, а функции — как операции над списками. В табл. 4 дан обзор функций обработки массивов и списков.
Функция push добавляет новый элемент в конец массива, а функция pop удаляет последний элемент. Аргументами функции push являются имя массива и список значений, которые нужно добавить в массив в качестве новых элементов.
За один раз можно добавить несколько новых элементов. Функция pop удаляет из массива последний элемент и возвращает его значение. Функции shift и unshift обрабатывают начало списка. Функция unshift удаляет первый элемент списка, после чего первую позицию занимает тот элемент, который ранее был вторым; shift добавляет в начало списка новый элемент. Аргументом функции unshift является имя массива. Возвращает эта функция значение удаленного элемента. Аргументы функции shift — имя массива и значение элемента, который вы хотите вставить. Эта функция возвращает общее число элементов на текущий момент. Функция sort сортирует элементы массива в соответствии с используемой в системе кодовой таблицей символов (обычно это набор символов ASCII), располагая элементы, в порядке возрастания. Функция split используется для создания массива и присваивания ему значений, полученных из строки. Для обозначения в строке извлекаемых значений применяется заданный разделитель. В результате формируется список значений, которые присваиваются элементам массива. Функция split часто употребляется для обработки строк входных данных, которые уже разбиты на поля, разделенные символом, например запятой или двоеточием. Функция grep представляет собой средство поиска в массиве или списке. Она работает так же, как и одноименная утилита в операционной системе Linux, а ее аргументами являются образец для поиска и имя массива. Функция grep возвращает значение совпавшего с образцом элемента.
Таблица .4. Операции с массивами
Операции со скалярными Назначение
массивами, ©array
push (массив, список-значений) Добавление элемента в конец массива
pop (массив) Удаление последнего элемента массива
shif t (массив, список-значений) Добавление элемента в начало массива
unshif t (массив) Удаление первого элемента массива
sort (массив) Сортировка элементов массива по возрастанию
reverse (массив) Сортировка элементов массива по убыванию
split (разделитель, строка) Разбивка строки на элементы. Разделитель может быть ре-
гулярным выражением или строкой
join (разделитель, массив) Объединение элементов массива в одну строку
grep (массив, шаблон) Поиск образца среди элементов массива
splice (массив, индекс) Удаление указанного элемента из массива. Элементы ну-
меруются с нуля
splice (массив, индекс, число) Удаление из массива указанного количества последова-
тельных элементов
splice (массив, число, 0, строка) Вставка в массив элемента со значением строка
splice (массив, $targv, 0, строка) Добавление нового элемента в конец массива
Операции с ассоциативными Назначение
массивами, %аггау
keys (%ассоц~массив) Генерирование списка всех индексных строк в ассоциа-
тивном массиве
values (%ассоц-массив) Генерирование списка значений всех элементов в ассоциа-
тивном массиве
each (%ассоц-массив) Возврат значения следующего элемента и его индексной
строки
delete (%ассоц-масив, индекс-строка) Удаление из ассоциативного массива элемента с указанным индексом
Общие операции над массивами Назначение
undef (массив) Удаление всего массива (скалярного или ассоциативного)
Ассоциативные массивы. В ассоциативном массиве для индексации элементов вместо числовых значений применяются строки. Индексную строку можно считать ключевым словом, которое используется для поиска элемента. В Perl ассоциативный массив определяется с помощью символа %, указываемого перед его именем. Список присваиваемых значений состоит из пар «индексная строка—значение элемента». За индексной строкой следует значение элемента, затем — следующая индексная строка и значение элемента и т. д. В приведенном ниже примере определяется ассоциативный массив city, состоящий из четырех элементов, каждый из которых имеет целочисленное значение и индексную строку в виде названия города.
%city = ('Sacramento', 4, 'Fallen', 86, 'Napa', 7, 'Alameda', 53 ) ;
Для установления ссылки на элемент ассоциативного массива применяется его индексная строка. Индексная строка заключается в одинарные кавычки и фигурные скобки (не круглые!).
print $city{'Fallon'};
Чтобы добавить в ассоциативный массив новый элемент, необходимо задать индекс в виде строки и значение этого элемента.
$city{'LA'} = 45;
Признаком списка значений ассоциативного массива является символ %, который ставится перед именем массива. В следующем примере задан вывод на экран всех значений массива city:
print %city;
В языке Perl для работы с ассоциативными массивами предназначен целый набор функций (списочных операций). С их помощью можно формировать списки ключей или значений. Эти функции облегчают выполнение итерации в ассоциативном массиве. Получить значения строк, применяемых для индексирования элементов ассоциативного массива, довольно тяжело, что отличает его от обычного массива. В скалярном массиве индексирование всегда начинается с 0, а завершается последним элементом. В ассоциативных массивах в качестве индексов выступают произвольные строки. Эти строки служат для обращения к элементам массива. С помощью функции keys можно создать список, состоящий из индексных строк ассоциативного массива. Один из дальнейших путей применения индексных строк — индексирование самого массива. Функция keys использует в качестве аргумента имя ассоциативного массива и возвращает список всех индексных строк, которые можно применять для обращения к отдельным элементам массива. В следующем примере функция keys генерирует список индексных строк массива city. Индексные строки поочередно присваиваются переменной myindex. Затем, при выполнении операции вывода на экран, производится индексирование массива city посредством переменной myindex.
foreach Smyindex ( keys(%city) )
{
print " $city($myindex) \n " ;
}
Функция each подобна функции keys, однако она наряду с индексной строкой для элемента ассоциативного массива возвращает и значение самого элемента. Аргументом функции each является имя массива. Итак, при обращении к функции each возвращается следующий элемент массива и соответствующая ему индексная строка. В примере, приведенном ниже, переменным myindex и myval присваивается индексная строка, а также значение первого элемента массива myvar.
($myindex, $myval) = each (%city) ;
Для обращения к каждому элементу массива можно использовать функцию each, поместив ее в цикл. В следующем примере с помощью функции each переменным myval и myindex поочередно присваиваются каждый элемент массива и его индексная строка.
while ( ($myindex, $myval) = each (%city) ;
{
print "$myval $myindex\n " ;
}
Функция values возвращает список значений всех элементов ассоциативного массива. Ее применение целесообразно, если требуется сформировать список значений элементов ассоциативного массива без индексных строк.
Средством удаления элемента из ассоциативного массива является функция delete. Она использует в качестве аргумента индексную строку удаляемого элемента и возвращает его значение. В следующем примере функция delete применяется для удаления элемента, соответствующего индексной строке «Sacramento».
delete (%myarr, "Sacramento") ;
Удалить целый массив позволяет функция undef. Ее действие распространяется как на скалярные, так и на ассоциативные массивы. При полном удалении массива уменьшается объем используемой памяти.
Управляющие структуры. Управляющие структуры языка Perl подобны управляющим структурам языков gawk и С, а также интерпретатора TCSH. В Perl-сценариях используются циклы, обеспечивающие повторение команд, а также условия, которые позволяют выбирать команду из нескольких заданных. В выражениях условий применяются как строковые (табл. 5), так и числовые (табл. 3) операторы, а также регулярные выражения. Управляющие структуры Perl и их синтаксис описаны в табл. 6.
Таблица 5. Строковые, логические, файловые операции и операции присваивания
Операции сравнения Описание
строк
gt Больше чем
lt Меньше чем
qe Больше или равно
le Меньше или равно
eq Равно
ne Не равно
Проверка файлов Описание
-e Файл существует
-f Файл существует и является обычным
-s Файл не пуст
-z Файл пуст и имеет нулевой размер
-r Файл читаемый
-w Возможна запись в файл и его модификация
-х Файл исполняемый
-d Именем файла является имя каталога
-b Бинарный файл
-Т Текстовый файл
Операции присваивания Описание
= Присвоить значение переменной
Таблица 6. Управляющие структуры, циклы и функции Perl Управляющие структуры Описание
МЕТКА: { Блок представляет собой набор операторов, заключенных в
операторы: фигурные скобки. Операторы выполняются последовательно.
} Блок может иметь метку
Условные управляющие Описание
структуры: if, else, elsif, case
if (выражение) { Операторы выполняются, если проверочное выражение воз-
операторы', вращает истинное значение. Необходимо, чтобы операторы на-
} холились внутри блока
Таблица 6. Управляющие структуры, циклы и функции Perl (продолжение)
Условные управляющие Описание структуры: if, else, elsif, case
if (выражение) { Операторы выполняются, если проверочное выражение воз-
операторы; вращает истинное значение. В противном случае выполняются
} операторы в блоке else
else (выражение) {
операторы;
}
if (выражение) { Ключевое слово elsif позволяет создавать вложенные струк-
операторы; туры if и выбирать один из нескольких вариантов. При обна-
} ружении первого истинного if-выражения выполняются соот-
elsif (выражение) { ветствующие операторы, а управление передается операторам,
операторы; следующим за структурой elsif
}
else (выражение) {
операторы;
}
unless (выражение) { Операторы выполняются, если проверочное выражение воз- операторы; вращает ложное значение }
Выражение ? оператор1 : Если выражение истинно, выполняется onepamop1, иначе —
оператор2 оператор2
МЕТКА: { Имитирует структуру switch, используя if в блоке, причем
if (выражение) { оператор last указывает на метку блока {операторы; last МЕТКА};
}
Операторы цикла: Описание while, until, for, foreach
METKA:while (выражение) { Операторы выполняются, пока проверочное выражение
операторы; возвращает истинное значение. МЕТКА не обязательна
}
do { Операторы выполняются, пока проверочное выражение воз-
операторы; вращает ложное значение } until (выражение)
foreach переменная (список- Цикл foreach предназначен для обработки списков значе-
значений) ний, например массивов. Операнду переменная последователь-
{ но присваиваются указанные значения операторы; }
for (началъное-выражение ; Операторы выполняются, пока выражение возвращает истин-
выражение ; выражение- ное значение. Первое выражение, началъное-выражение,
инкрементирования) выполняется до начала цикла, а третье выражение, выраже-
{ ние-инкрементирования, вычисляется внутри цикла после вы-
операторы; полнения операторов }
МЕТКА : блок-или-цикл Блоку или циклу назначается МЕТКА. Применяется совместно
с командами next, last и redo
Операторы цикла: Описание
while, until, for, foreach
next Этот оператор указывает пропустить оставшуюся часть цикла
и начать новую итерацию. Он похож на оператор continue языка С; блок оператора continue выполняется
continue { операторы;} Задает блок команд, которые выполняются даже в том случае,
если задана новая итерация посредством оператора next
redo МЕТКА Задает повторное выполнение цикла, даже если условие вы-
полнения цикла не соблюдается. Блок оператора continue пропускается
last МЕТКА Служит для выхода из блока или цикла. Блок оператора con-
tinue пропускается. Этот оператор подобен оператору break языка С
Функции Описание
sub имя-функции; Объявление функции
sub имя-функции { операторы; Определение функции с указанным именем )
& имя-функции (список- Вызов функции с указанными аргументами
аргументов)
@_ Массив переданных значений аргументов функции. Обраще-
ние к аргументам выполняется с помощью переменной $_и индексов. $_[0] соответствует первому аргументу
$#_ Количество аргументов, передаваемых текущей функции
Операции сравнения. В языке Perl для сравнения строковых и числовых значений применяются различные наборы операторов. Строковые операторы записываются в виде двухбуквенных кодов, как в интерпретаторе BASH shell, например: eq (проверка идентичности двух строк), gt (сопоставление размеров строк). В качестве операторов сравнения числовых значений выступают символы, которые употребляются и в других языках программирования (в частности, в С): > — больше чем, = = — равно и т. д.
В операциях сравнения используются также шаблоны. Оператор строкового шаблона, =~, выполняет проверку соответствия строки шаблону. Правый операнд является шаблоном, а левый представляет собой строку. Шаблоном может быть любое регулярное выражение, что делает эту операцию универсальной.
Шаблоны сравниваются либо с заданной строкой, либо с содержимым специальной переменной — $_. Оператор шаблона состоит из двух символов «/», между которыми указывается шаблон для поиска (любое регулярное выражение): /шаблон/.
Язык Perl поддерживает логические операции И, ИЛИ и НЕ. Каждая из них имеет два варианта: стандартный и применяемый при обработке списков. К категории стандартных логических операторов принадлежат ss, | | и !. Оператор && соответствует логической операции И, || — ИЛИ, ! — НЕ. Рассмотрим их синтаксис:
(выражение) && (выражение)
(выражение) || (выражение)
!{выражение)
Логическая операция И (&&) возвращает значение 0 (истинна), если оба выражения возвращают значение 0 (истина). Логическая операция ИЛИ (||) возвращает значение О (истина), если хотя бы одно из выражений является истинным. Допускается как раздельное, так и совместное применение описанных логических операций. Один из случаев использования — тестирование управляющих структур (таких, как while и if).
В сценариях Perl часто можно встретить операцию ИЛИ, которая используется вместе с командой открытия файла. Если при выполнении операции ИЛИ первое выражение является ложным, проверяется второе выражение. Предположим, что вторым выражением является команда die, завершающая работу программы. Тогда в случае неудачного выполнения операции открытия файла работа программы будет завершена (первое выражение является ложным).
open (REPS, "+> $filen") or die "Can't open $filen";
Операция И работает подобным образом с той разницей, что второе выражение проверяется тогда, когда первое истинно. В следующем примере задан поиск пустой строки и вывод сообщения при ее обнаружении.
/^$/ && print "Found empty line";
Циклы. В языке Perl имеются следующие циклы: while, do-until, for и foreach. Цикл while является универсальным, в то время как циклы for и foreach служат для решения специфических задач. Цикл foreach представляет собой удобное средство обработки списков и массивов. Циклы while, do-until и for во многом подобны их эквивалентам в языке С. Так, цикл for поддерживает те же три формата выражений. Цикл foreach похож на одноименный цикл в интерпретаторе С shell и облегчает обработку списков элементов.
Цикл while можно адаптировать для работы с массивами. Для управления таким циклом (и индексирования элементов массива) применяют переменную, которую помещают внутрь цикла. В следующем примере элементам массива title присваиваются значения, после чего содержимое каждого элемента выводится на экран с помощью цикла for. Обратите внимание на то, что значением переменной $#num является число элементов массива. Это значение используется в проверочном выражении цикла for и указывает, когда должен завершиться цикл.
titlearr.pl
# ! /usr/bin/perl
# Программа для определения и отображения значений скалярного массива
@title = ("Tempest", "Iliad", "Raven"); # определение массива с тремя элементами for ($i = 0; $i <= $#title; $i++) # Обработка в цикле всех элементов массива,
# $#title - количество элементов
{
print "$title[$i] \n"; # Отображение значений элементов массива title
}
$ titlearr.pl
Tempest
Iliad
Raven
Цикл foreach представляет собой эффективное средство обработки массивов. В этом цикле надлежит либо использовать имя массива со списком всех возможных значений, либо указать диапазон допустимых значений. В следующем примере массив @mylist содержит значения, которые последовательно присваиваются переменной $mynum в цикле foreach.
mynumlist.pl
#!/usr/bin/perl
# Программа отображения значений элементов массива
foreach @mylist = ( 34, 21, 96, 85); # Определение массива с 4 элементами
foreach $mynum ( @mylist ) #присваивание переменной $mynum значения каждого из элементов
{
print "$mynum \n";
}
С помощью массива @ARGV можно обработать элементы командной строки как список значений. Аргументы, указанные в командной строке при вызове сценария, становятся списком" значений, к которому происходит обращение в цикле foreach. Переменной, используемой в этом цикле, поочередно присваиваются значения всех аргументов: при первой итерации цикла — значение первого аргумента, при второй итерации — значение второго аргумента и т. д.
В Perl существуют специальные команды для более тонкого управления циклами и блоками операторов. Они имеют аналоги в языке С, использующие ссылки на метки в программе. Если вы применяете их для управления циклом, надлежит снабдить этот цикл меткой.
Команда last соответствует команде break языка С. Она предназначена для завершения выполнения цикла, а также блока операторов. Команда next позволяет пропустить оставшиеся в цикле операторы. Она аналогична команде continue языка С и рассчитана на работу с блоком продолжения. Блок продолжения состоит из команды continue и следующего за ней блока операторов. Этот блок выполняется в конце цикла. Даже если применяется команда next (разрешено пропустить оставшиеся операторы), блок продолжения всегда выполняется. С его помощью можно обеспечить выполнение таких операций, как инкрементирование счетчика цикла. Назначение команды redo — повторение цикла, в том числе тогда, когда условие его выполнения не соблюдается. В языке С подобной команды нет. Чтобы проигнорировать блоки продолжения, следует обратиться к командам redo и last.
Проверка условий: if, eisif, unless и switch. Структуры if-else и elsif применяются для выбора одного из нескольких вариантов. Можно ограничиться использованием оператора if, если вариант один, либо объединить его с else или elsif, если на выбор предлагается ряд вариантов. Структура if содержит проверочное выражение, заключенное в круглые скобки, и блок операторов. Если в результате проверки получено истинное значение, операторы выполняются, иначе блок пропускается. В отличие от других языков программирования, в Perl за проверочным выражением может идти только блок операторов в фигурных скобках (даже если он состоит из одного оператора). В следующем примере проверяется, успешно ли выполнена операция открытия файла. Если это не так, выполняется команда die, которая завершает работу программы. Операция НЕ (!) выдает значение «истина», если выполнение функции open завершилось неудачно, обеспечивая, таким образом, активизацию команды die.
if (!(open (REPS, "< $filen")))
{
die "Can't open $filen";
} else
{
print "Opened $filen successfully" ;
}
Функции обработки строк. Стандартные операции со строками (например, определение длины строки, копирование подстроки из строки и т. д.) производятся посредством функций length, index и substr. Особый интерес представляет функция split, которая генерирует массив, разбивая строку на элементы. Она подобна функции split языка gawk. Оператор . служит для конкатенации двух строк, а оператор х генерирует строки, состоящие из повторяющихся символов.
Рассмотрим, как к имени файла myaddress добавить суффикс .dat. Для конкатенации двух строк воспользуемся оператором точка (.). Если содержимое переменной $cur-file — myaddress, то в результате выполнения приведенного ниже оператора переменная $newfile получит значение «myaddress.dat».
$newfile = $curfiie . ".dat";
Оператор х позволяет повторить строку несколько раз. Перед знаком оператора, х, вводится повторяемая строка, а за ним — число повторений. Строка может состоять как из одного, так и из нескольких символов. С помощью оператора х можно сформировать список, элементы которого имеют одинаковые значения и который используется при инициализации массива.
Таблица 7. Строковые операторы Оператор Описание
строка . строка Оператор . служит для конкатенации строк
строка х число Повторение строки или символа указанное число раз
Строковые функции Описание
chomp (строка} Удаление последнего символа строки
substr (строка, начальная- Возврат подстроки указанной длины, начиная с заданной позиции позиция, длина}
substr (строка, начальная- Замена указанной части строки заданной строкой позиция, длина} — строка
length (строка) Определение длины строки
index (строка, образец} Поиск позиции образца в строке
rindex (строка, образец} Поиск последней позиции образца в строке
В следующем примере массиву присваивается список из пяти нулей, который создается оператором х.
@аrrау = (0) х 5;
Сопоставление с образцом. С помощью средств языка Perl можно производить поиск в строке по образцу. Искомый образец заключается в символы косой черты. Например, чтобы задать поиск слова Dickens, необходимо ввести /Dickens/. По умолчанию поиск выполняется в содержимом специальной переменной $_. Эта переменная обычно содержит последнюю из прочитанных входных строк, независимо от ее источника. Если последней была введена команда <STDIN>, содержимым $_ будет строка, прочитанная со стандартного ввода. Именно в ней будет выполняться дальнейший поиск. В следующем примере осуществляется чтение строки со стандартного ввода, после чего в ней производится поиск по образцу /Dickens/:
$_ = <STDIN>; /Dickens/;
Поиск по образцу задается с помощью оператора =~. Левым операндом в данном случае является имя переменной, а правым — образец. В табл. 8 дан обзор операторов поиска и опций сопоставления с образцом. Ниже показано, как задать поиск по образцу /Christmas/ в переменной $title.
$title =~ /Christmas/;
Язык Perl поддерживает полный набор регулярных выражений, используемых в процессе поиска по образцу. Символы *,+,?,{}, .. ^. $ и [] можно применять для задания многовариантного поиска. Существует набор символов, с помощью которых в регулярных выражениях можно сокращенно обозначать часто используемые шаблоны. Например, \w соответствует любой букве или цифре и является эквивалентом регулярного выражения [A-Za-z0-9]+. Символ \d служит для обозначения цифр, a \s — пробела. С помощью символа \b задают поиск слова, совпадающего с образцом. В ряде случаев ввод специального символа в верхнем регистре придает ему противоположный смысл. Так, \w означает все, кроме букв и цифр, а \о — все, кроме цифр. Специальные символы, которые употребляются в регулярных выражениях языка Perl, перечислены в табл. 9.
Таблица 8. Операторы и опции задания шаблонов Операторы Описание
var =~ /регулярное-выражение/ Поиск экземпляра выражения в строковой переменной
var ! ~ /регулярное-выражение/ Позволяет удостовериться в том, что выражение не встречается в строковой переменной
/регулярное-выражение/ Сравнение с образцом с помощью регулярного выражения
Опции Описание
i Сопоставление с образцом без учета регистра
m Рассматривать строковое значение как несколько строк
s Рассматривать строку как одну строку
Таблица 9. Регулярные выражения
Специальные символы Описание
^ Начало строки
$ Конец строки
с* Нуль или более последовательных экземпляров указанного символа
. Любой одиночный символ
с+ Один или более последовательных экземпляров указанного символа
с? Нуль или один экземпляр указанного символа
с{число] Задает число последовательных экземпляров указанного символа
с{мин, макс} Задает минимальное и максимальное число последовательных экземп-
ляров указанного символа
[список-символов] Набор символов
[символ-символ] Диапазоны символов
[^список-символов] Любые символы, отсутствующие в указанном списке или диапазоне
[^символ-символ}
регулярное-выражение \ Поиск любого из указанных регулярных выражений.
Регулярные выражения Описание с Esc-символом
\w Любая буква или цифра, [a-zA-ZO-9]+
\d Любая цифра, [0-9] +
\s Пробельные символы (пробелы, табуляторы, символы новой строки или
перевода страницы), [\n\t\r\f] +
\bслово Слово
\W He цифры и не буквы, [~a-zA-ZO-9]+
\D He цифры, ["0-9] +
\S He пробельные символы, P\n\t\r\f] +
\Bобразец Любое слово, не совпадающее с образцом
Функции: sub. Структуру сценариев Perl можно упорядочить за счет использования подпрограмм, которые заменяют длинные последовательности операторов и служат для решения конкретных задач. Если одна и та же операция должна быть неоднократно выполнена в ходе работы программы, не обязательно повторять код соответствующее количество раз. Можно создать для этой операции подпрограмму и вызывать ее столько раз, сколько требуется. Подпрограммы определяются посредством команды sub, за которой следует имя подпрограммы и блок операторов. По принципам функционирования подпрограмм мы подобны функциям в С-программах и процедурам в программах на других языка? Они могут принимать аргументы и иметь параметры с предопределенными именами. В табл. 10 представлены различные компоненты, образующие подпрограмму Perl, в следующем примере показано, как определить подпрограмму (в данном случае -dispfile).
sub dispfile
{
print "Please enter in name of file to be displayed: ";
chomp($filename = <STDIN>);
system("cat $filename"};
}
Подпрограммы Perl можно определять до или после разработки основного сценария Основные операторы желательно размещать в отдельном блоке. Если подпрограмме используется до своего определения, то ее необходимо объявить. Эта процедура производится подобно объявлению функций в С. Объявление подпрограммы состоит и: ключевого слова sub 'и имени подпрограммы, за которой следует точка с запятой. Обычно подпрограммы объявляются в начале сценария Perl, после чего следуют основной блок операторов и подпрограммы. В следующем примере объявляется подпрограмма dispfile. sub dispfile;
Таблица 10. Подпрограммы Perl
Компоненты подпрограмм Описание
@_ Массив, содержащий аргументы подпрограммы
sub имя {операторы;} Определение подпрограммы
sub имя; Объявление подпрограммы
sub имя (список-типов) ; Объявление прототипа подпрограммы
имя-функции; Вызов функции
имя-функции (аргументы) ; Вызов функции
&имя-функции аргументы ; Вызов функции
my (список-объектов) Локальные переменные, определенные в данной подпрограмме или блоке
local (список-объектов) Локальная версия глобального объекта, известная текущей подпрограмме и блоку, а также остальным вызванным подпрограммам
\@ имя-массива Ссылка на массив (используется в списке аргументов для под-
держания целостности массива)
При работе с Perl 5 существует несколько способов вызова подпрограмм. Обычно для вызова подпрограммы указывают ее имя, предваренное символом &. Например, запись Sdispfile служит для вызова подпрограммы dispfile. Вместо символа S, можно применять круглые скобки. Если подпрограмма объявлена, для ее вызова достаточно указания имени. Ниже представлены различные способы вызова подпрограммы:
dispfile;
$dispflie;
dispfile ();
Подпрограммы могут принимать аргументы и возвращать значения в вызывающую программу. Аргументы и возвращаемые значения передаются как списки. Аргументы, указанные в вызове подпрограммы, становятся элементами массива @_, который затем передается в подпрограмму. Для обращения к конкретному аргументу используются те же операции, что и для обработки массивов и списков. Массив @_ применяется во всех подпрограммах для доступа к их аргументам.
Обращение к аргументам в массиве @_ происходит так же, как и к элементам любого массива. Первый аргумент обозначается как $_[0], второй — как $_[!] и т. д. В следующем примере подпрограмма dispfilearg получает в качестве аргумента имя файла. Используя элемент $_ [ 0 ], она выводит имя файла.
sub dispfilearg
{
system (“cat $_[0]");
}
Для вызова этой подпрограммы подходит любой из следующих способов:
dispfilearg ("myfile");
$dispfilearg "myfile";
Если аргументами являются константы, то список @_ содержит только значения, а если в этом качестве выступает переменная или массив, в список @_ помещаются ссылки на эти объекты. В случае изменения этих объектов при обращении через массив @, обновляются исходные объекты в вызывающей функции. Так, если в качестве аргумента функции используется строковая переменная, а затем этот аргумент с помощью массива @_ применяется в операции присваивания, то значение этой переменной изменяется.