1. Введение в язык PERL

Опубликовал в рубрике Лекции.

Perl (Practical Extraction and Report Language) – это язык программирования, создателем которого является Ларри Уолл. Аббревиатура Perl расшифровывается как практический язык для извлечения данных и составления отчётов. Основной особенностью языка считаются его богатые возможности для работы с текстом, в том числе реализованные при помощи регулярных выражений. Perl унаследовал много свойств от языков Си, shell script, awk.

Perl также знаменит огромной коллекцией дополнительных модулей CPAN, находящейся по адресу http://www.cpan.org/.

Сегодня основной для разработчиков является пятая версия языка Perl однако (на некоторых веб-серверах) продолжают использоваться программы (скрипты), написанные на предыдущей – четвёртой версии (из-за частичной обратной несовместимости). Фактически стандарт языка определяется реализацией интерпретатора.

С 2000 г. идёт разработка новой (6-ой) версии языка. В отличие от предыдущих версий, разработчики планируют создать чётко определённый стандарт языка.

Perl – далеко не единственный язык, дающий богатые возможности в обработке текста. Языки программирования РЕФАЛ, Icon и Snobol предоставляют возможность использовать более полно метод программирования «сопоставления с образцом», частным случаем которого и являются регулярные выражения.

Существует также полноценный shell, использующий в качестве основы язык Perl. Называется он psh и даёт возможность смешивать команды обычного шелла и самого Perl’а.

1.2 Синтаксис языка Perl

Синтаксис Perl имеет много общего с синтаксисом языков Си, Awk, sed и shell.

В Perl всё, что идёт в строке после символа #, считается комментарием, однако первая строка исходного кода начинается с «#!/Путь/к/Perl [-ключи]» – что указывает системе путь к интерпретатору Perl для выполнения программы в UNIX системах и выполнения их на Веб Сервере.

Простейшая программа Hello world выглядит следующим образом:

#!/usr/bin/perl

print «Hello, world!\n«;

либо (для веб):

#!/usr/bin/perl

print «Content-type: text/html\n\n«;

print «Hello, world!»;

Строка содержит вызов функции print, которой передаётся строка Hello, World! и символ новой строки. Функция должна отобразить эту строку на экране. В конце оператора следует точка с запятой. В Perl символ ; называется опера тором-разделителем. Он разделяет операторы в программах Perl и указывает, где конец одного оператора и начало следующего.

1.3 Типы данных в Perl

Основные типы данных: скаляр, массив, хеш-таблица, функция, файловый дескриптор и константа. Переменные разных типов отличаются знаком, который стоит перед именем переменной.

$foo; # скаляр или указатель

@foo; # массив

%foo; # хеш-таблица

&foo; # функция

FOO; # дескриптор ввода-вывода или константа

Скаляры − базовый тип данных в Perl. Каждый скаляр (или переменная скалярного типа) может содержать отдельное слово, запись, документ, строку текста или символ, ссылки на другие объекты, а также литеральные данные, т.е. данные, значение которых не изменяется во время выполнения программы. В некоторых языках программирования для такого рода данных используются термины константа или литерал.

Скалярные переменные используются для хранения одиночных значений. Перед именем скалярной переменной необходимо ставить знак доллара ‘$’. Тип скалярной переменной не фиксирован (в отличие от, например, языка Си) и определяется динамически в зависимости от контекста. Например,

$x = 10; # число

$y = $x + 1; # используем $x как число…

$z = $x . ‘string’; # … а теперь − как строку

$ref = \$x;  # $ref является указателем на $x

$$ref=0; # $x содержит значение 0

Имена переменных должны состоять из идентификатора типа и идущих за ним символов латинского алфавита (a—z и A—Z), цифровых символов или символа подчеркивания. Но первый символ переменной не может быть цифрой.

Имена переменных чувствительны к регистру. Это означает, что для имен переменных немаловажно, в какой форме идет буквенный символ: строчной или прописной. Следующие имена представляют различные скалярные переменные:

$value

$VALUE

$Value

$valuE

Кроме того, в Perl зарезервированы имена некоторых односимвольных переменных. Такие переменные, как $_, $», $/, $2 и $$, называются специальными и их не следует использовать как обычные переменные в Perl-программах.

В отличие от некоторых других языков программирования, в Perl переменные перед использованием не обязательно должны быть описаны и проинициализированы. Для создания скалярной переменной просто используйте ее. Для неинициализированных переменных Perl использует значение, принятое по умолчанию. Если переменная используется как число (например, в математическом выражении), её значение по умолчанию — 0 (нуль), если переменная используется как строка (т.е. почти во всех остальных случаях), используется «» или пустая строка.

Пример программы на Perl

1: #!/usr/bin/perl -w

2:

3: $radius=50;

4:

5: $area=3.14159*($radius ** 2);

6: print $area;

Другим типом скаляров Perl являются так называемые скалярные переменные. Переменные содержат данные, которыми можно свободно манипулировать.

Perl содержит два различных типа скалярных констант, называемых литералами:

− числовые и строковые литералы.

Числовые литералы − это обычные числа. Строковые литералы в Perl — это обычные строки символов. Они могут содержать любое количество данных. Размеры строк ограничены лишь размерами виртуальной памяти компьютера. Строки могут содержать данные различных типов — текст ASCII со стандартным набором символов, текст ASCII с полным набором символов и даже двоичные данные. Строки могут быть также пустыми.

В Perl строковые литералы заключаются в кавычки. Этот процесс называется квотингом (quoting) строки. Для этого можно использовать или одинарные (‘ ‘), или двойные кавычки (» «).

Например: «И тогда я сказал ему: \»Иди и принеси мне это.\»"

При наборе строки с большим количеством кавычек очень легко допустить ошибку, поскольку перед каждой внутренней кавычкой нужно обязательно поставить обратную косую черту, поэтому для облегчения процесса квотинга в Perl предусмотрены специальные операторы qq и q. Оператор qq заменяет двойные кавычки и ведет себя почти во всех случаях точно так же, как пара двойных кавычек:

qq(H тогда я сказал: «Иди вперед», а он ответил: «Слушаюсь!».)

Одинарные кавычки могут быть заменены оператором q:

q(‘Литералы’ нужно заключить в одинарные кавычки)

Для обозначения начала и конца строк в операторах qq и q можно использовать любые символы, кроме алфавитно-цифровых. Эти символы называются ограничителями (delimiters). Например:

q,’Литералы’ нужно заключить в одинарные кавычки,

Массив является упорядоченным списком скаляров. Каждый элемент массива имеет порядковый индекс, с помощью которого к нему можно получить доступ. Нумерация элементов начинается с нуля, то есть первый элемент списка имеет индекс 0. Перед именем переменной-массива необходимо ставить знак ‘@’, а для доступа к определённому элементу массива рекомендуется ставить знак ‘$’, так как определённый элемент массива является скаляром. Многомерные массивы можно смоделировать, помещая в список ссылки на другие списки.

@array = (1,2,3,4); # записали в массив @array четыре элемента

print $array[2]; # напечатать третий элемент

print @array[2]; # также напечатать третий элемент, но рекомендуется использовать предыдущую версию

Множества объектов в Perl реализованы с помощью списков данных. Списки данных могут быть представлены тремя способами: с использованием простых списков, массивов и ассоциативных массивов.

Списки являются простейшей формой представления множества данных, по сути — это просто группа скаляров. Список представляет собой последовательность имен скаляров, разделённых запятыми. Вся последовательность заключена в круглые скобки. Например (2, 5, $а, «Bob») — список, состоящий из двух чисел, переменной $а и слова «Bob». Каждый отдельный скаляр называется элементом списка.

Для хранения списка в виде переменной используется массив. Имена переменных массивов в Perl подчиняются тем же правилам, что и имена остальных переменных. Имена скаляров и массивов могут совпадать, например $names и @names — совершенно различные переменные. Первая обозначает скаляр, а вторая — массив и совсем могут не иметь никакого отношения друг к другу.

Хеш-таблица представляет собой ассоциативный массив, позволяющий ассоциировать строку (называемую ключ) со скаляром (значение). Строка называется ключом, а скаляр в хеш-таблице значением. Перед именем переменной-списка необходимо ставить знак процента ‘%’, а для доступа к определённому элементу массива рекомендуется ставить знак ‘$’.

Физически Хеш-таблица представляет собой массив, где в нечётных позициях находятся ключи, а на чётных − значения.

%hash = (

‘cat’ => ‘kitten’,

‘dog’ => ‘puppy’,

‘cow’ => ‘calf’

);

print $hash{‘cat’}; #Напечатает kitten

print %hash{‘cat’}; #Также напечатает kitten, но рекомендуется использовать предыдущую версию

print join(«-», keys %hash) ; # Вывод всех ключей. Напечатает cat-dog-cow

print join(«-», values %hash) ; # Вывод всех значений. Напечатает kitten-puppy-calf

print join(«-», %hash) ; #Напечатает cat-kitten-dog-puppy-cow-calf

Функция представляет собой фрагмент исполняемого кода. Функция всегда возвращает какое-либо значение либо UNDEF. Если возвращаемое значение явно не указано оператором return, возвращается последнее вычисленное значение.

sub printTwo

{

print 2;

}

sub three

{

3;

}

$s=\&three;

print &$s; #Напечатает 3

$s=\&printTwo;

print &$s; #Напечатает 21. `2` в коде функции, а `1` как значение, возвращаемое функцией printTwo

print &printTwo #То же самое

Константа

Константа представляет собой неизменяемое значение. Использование:

use constant MY=>2;

print MY;

Файловый дескриптор

Представляет собой указатель на файл, устройство или PIPE канал, открытые для записи, чтения или для записи и чтения.

Использование:

$s=<STDIN>; #Читаем одну строку из дескриптора STDIN (стандартный поток ввода)

@values=<FILE>; #Читаем все строчки из некоторого открытого и связанного с дескриптором FILE файла.

print STDOUT $s; #Печатаем в STDOUT (стандартный поток вывода)

Perl может оперировать не только числами, но и строками. Рассмотрим оператор конкатенации (.). Этот оператор берёт строку, находящуюся слева от него, и строку справа и возвращает строку, объединяющую предыдущие две, например:

$а=»Привет, мой Свет!»;

$b=»Как я рад тебя видеть»;

$с=$а . $b;

В этом примере переменные $а и $b имеют простые строковые значения. В последней строке переменной $с присваивается значение Привет, мой Свет! Как я рад тебя видеть, при этом значения переменных $а и $b не изменяются.

Конкатенацию строк можно выполнить и другим способом, например:

$name=»Джон»;

print «Привет, $name!»;

В этом примере Perl ищет в строке в двойных кавычках имена переменных, находит имя $name и подставляет вместо него строку Джон. Этот процесс называется интерпретацией значения переменных. Это означает, что имя переменной внутри строки в двойных кавычках заменяется реальным значением этой переменной.

Другим строковым оператором является оператор повторения х. В операторе х указываются два аргумента — строка, которую необходимо повторить, и число повторений. Например:

$line = «-» х 5;

В предыдущем примере символ «-» повторяется 5 раз оператором х. Результат сохраняется в переменной $line.

Оператор <STDIN> возвращает строку, введённую с клавиатуры. <STDIN> читает вводимые с клавиатуры символы до тех пор, пока пользователь не нажмет клавишу «Enter». Затем введённая строка помещается в переменную $size. Строка текста, возвращаемая оператором <STDIN>, содержит символ перевода строки, введенный пользователем при нажатии клавиши «Enter». Обычно не желательно, чтобы в конце введённой строки находился символ перевода строки, т.е. требуемая строка должна содержать лишь текст. Для удаления символа перевода строки можно воспользоваться оператором chomp:

Например:

print ‘Какой у вас размер обуви? «;

$size=<STDIN>;

chomp $size;

print «Ваш размер обуви — $size. Спасибо за внимание\n»;

Оператор chomp удаляет в строке-аргументе завершающий символ перевода строки. Он также возвращает количество удаленных символов — обычно это 1, но иногда 0, если ничего не удалено.

Для управления условным выполнением операторов Perl обычно используется оператор if. Синтаксис этого оператора приведён ниже:

if (выражение) БЛОК

Работает оператор if так: если выражение истинно, блок кода выполняется. Если выражение ложно, блок кода не выполняется. Рассмотрим пример:

if ( $r == 5 ) {

print ‘Переменная $r равна 5.’;

}

Пример более сложной условной конструкции:

$r=10;

if ($r == 10) {

print ‘$r равно 10!’;

} elseif ($r == 20) {

print ‘$r равно 20!’;

} else {

print ‘$r не равно ни 10, ни 20′;

}

1.4 Организация циклов с оператором while и for

ЦИКЛЫ while считаются наиболее простыми. Оператор while повторяет блок кода до тех пор, пока некоторое выражение истинно. Вот синтаксис этого оператора:

while (выражение) БЛОК

Когда интерпретатор Perl встречает оператор while, проверяется выполнение условия. Если выражение истинно, выполняется БЛОК кода. После выполнения всего блока повторно вычисляется значение выражения, если оно истинно, блок повторяется.

$counter=0;

while ($counter < 10 ) {

print «Выполняется $counter итерация цикла\n»;

$counter++;

}

Оператор for — более сложная, но в то же время более универсальная конструкция для организации циклов в Perl. Его синтаксис выглядит так:

for (инициализация; условие; инкремент) {БЛОК}

Когда Perl встречает оператор for, выполняется следующая последовательность действий.

• Вычисляется выражение инициализации.

• Вычисляется выражение, задающее условие окончания цикла. Если оно истинно — выполняется БЛОК кода.

• После выполнения блока производится приращение счетчика и снова проверяется условие. Если оно по-прежнему истинно, блок кода выполняется повторно. Этот процесс продолжается до тех пор, пока не перестает выполняться условие.

Ниже приведён пример цикла for:

for ( $а=0; $а<10; $а=$а+2 ) {

print «А равно $а\n»;

}

$i=10; # Инициализация значения переменной цикла

for { ; $i>-l; ) {

print «$i..»;

$i–; # Декрекент

}

print «Цикл окончен!\n»;

1.5 Операторы управления циклами

Кроме блоков, операторов for, while, if, управляющих порядком выполнения блоков, в Perl имеются операторы для управления программой внутри самих блоков.

Одним из таких операторов является last. С его помощью можно выйти из внутреннего выполняемого блока цикла. Вот пример:

while ($i<15) {

last if ($i==5);

$i++;

}

Оператор last позволяет досрочно завершить выполнение цикла while, если значение переменной $i равно 5. При этом не нужно дожидаться, пока условное выражение примет ложное значение. В случае использования вложенных циклов оператор last завершает выполнение текущего внутреннего цикла.

Кроме last, в Perl существует также оператор next. Он завершает текущую итерацию цикла и передает управление в начало цикла, например:

for ($i=0; $i<100; $i++) {

next if (not $i % 2);

print «Число =$i нечетное\n»;

}

Этот цикл выводит все нечётные числа в диапазоне от 0 до 100. Оператор next запускает следующую итерацию цикла, если $i содержит чётное число. Выражение $i % 2 возвращает остаток от деления $i на 2, а оператор not инвертирует полученное логическое значение. Таким образом, если число чётное, оператор print пропускается.

  1 Введение в язык PERL (76,0 Кб, 4 скачиваний)
You do not have permission to download this file.


Метки: