Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LINUX / ЛП_ieem_linux.doc
Скачиваний:
114
Добавлен:
27.03.2016
Размер:
1.94 Mб
Скачать

Программирование в среде 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";

Если аргументами являются константы, то список @_ содержит только значения, а если в этом качестве выступает переменная или массив, в список @_ помещаются ссылки на эти объекты. В случае изменения этих объектов при обращении через массив @, об­новляются исходные объекты в вызывающей функции. Так, если в качестве аргумента функции используется строковая переменная, а затем этот аргумент с помощью массива @_ применяется в операции присваивания, то значение этой переменной изменяется.

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