Спонсор: Microsoft
Воронежский государственный университет
Опубликован: 04.02.2009 | Доступ: свободный | Студентов: 7546 / 459 | Оценка: 4.14 / 3.78 | Длительность: 19:54:00
Лекция 5:

Языки разработки сценариев Perl и PHP

Аннотация: Язык Perl: синтаксис, основы. Язык PHP: синтаксис, основы.

Язык Perl

Язык Perl (Practical Extraction and Report Language) — это язык программирования, сильными сторонами которого считаются его богатые возможности для работы с текстом, в том числе реализованные при помощи регулярных выражений. Также язык известен тем, что имеет огромную коллекцию дополнительных модулей CPAN.

Чтобы запустить программу на языке Perl на выполнение, ее компиляция не требуется, она вполне может выполняться под управлением интерпретатора. Чтобы файл с исходным текстом Perl можно было запускать на выполнение, надо чтобы первая его строка выглядела так:

#!путь_к_интерпретатору_Perl

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

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

$a - скаляр или указатель

@b - скалярный массив

%c - ассоциативный массив (хеш-таблица)

&d - функция

F - дескриптор ввода-вывода или константа

Скалярные переменные используются для хранения одиночных значений. Они могут содержать числа, строки и ссылки на другие объекты. Перед именем скалярной переменной необходимо ставить знак доллара '$'. Тип скалярной переменной не фиксирован и определяется динамически в зависимости от контекста.

Скалярный массив является упорядоченным списком скаляров. Каждый элемент массива имеет порядковый номер (индекс), с помощью которого к нему можно получить доступ. Нумерация элементов начинается с нуля.

Перед именем переменной типа скалярный массив указывается знак @, а для доступа к определенному элементу массива необходимо ставить знак $, так как определенный элемент массива является скаляром:

@winter = ("декабрь",  "январь",  "февраль"); 
print "Второй месяц зимы ", $winter[1],  "\n";

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

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

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

Так, например, для того чтобы присвоить значение трем элементам массива %dict с индексами first, second и third, можно воспользоваться одним из двух способов, указанных ниже.

$dict {	'first' } = "первый";
$dict {	'second' } = "второй";
$dict {	'third' } = "третий";

или

%dict  { 'first', 'second', 'third' } =
"первый", "второй", "третий";

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

имя_массива = ( ключ 1, значение 1, ключ 2, значение 2, ... );

Для примера, приведенного выше, это выражение будет выглядеть так:

%dict = ("first",  "первый",  
"second",  "второй",  
"third",  "третий");

Рассмотрим приведенный следующий фрагмент программы на языке Perl.

while (<STDIN>)
{ print; }

Несмотря на то, что формально программа составлена правильно, она на первый взгляд может показаться бессмысленной. Однако при запуске она ведет себя точно так же, как и одна из программ "эхо". В языке Perl существует предопределенная скалярная переменная $_, используемая по умолчанию. Именно в нее помещаются данные, прочитанные из стандартного ввода, и из нее берется значение для вывода в STDOUT.

Кроме $_ в Perl имеются и другие предопределенные переменные:

  • $] - номер версии Perl.
  • $. - номер строки, прочитанной из файла последней.
  • $! - сообщение об ошибке.
  • $$ - идентификатор текущего процесса.
  • $^T - время в секундах с начала 1970 года до запуска данной программы.
  • $O - имя файла, в котором содержится выполняемая программа.
  • $1...$9 - фрагменты текста, отмеченные при выполнении операции сопоставления с шаблоном.

Подобно предопределенным скалярным переменным, в Perl существуют массивы, имеющие специальное значение. Наиболее важный из них - ассоциативный массив %ENV, содержащий текущие значения переменных окружения. Чтобы получить значение переменной окружения, надо обратиться к элементу данного массива, указав в качестве индекса имя переменной окружения. Так, приведенное ниже выражение записывает в скалярную переменную $path_string значение переменной окружения PATH.

$path_string = $ENV { 'PATH' };

Одна из первых строк CGI-сценария на Perl, может выглядеть так

$method = $ENV { 'REQUEST_METHOD' };

Для работы с файлами и потоками в Perl предусмотрены специальные файловые дескрипторы.

Файловые дескрипторы представляет собой указатель на файл, устройство или PIPE канал, открытые для записи, чтения или для записи и чтения. Оператор " <> " в Perl называется бриллиантовым оператором (diamond operator). Он определяет операцию чтения строки из потока, дескриптор которого содержится в угловых скобках:

$str=<STDIN>;   #чтение строки из дескриптора STDIN (стандартного потока ввода)
@lines=<F>;      #чтение всех строк из связанного с дескриптором файла F.
print STDOUT $str; #печать в STDOUT (стандартный поток вывода)

Для связывания файла с файловым дескриптором используется функция open. Ниже приводятся варианты использования этой функции:

open дескриптор_потока > имя_файла файл открывается для вывода данных. Если файл с указанным именем отсутствует, создается новый файл.
open дескриптор_потока >> имя_файла файл открывается в режиме, позволяющем записывать данные в конец файла.
open дескриптор_потока +> имя_файла открытый файл становится доступным для чтения и для записи.

Функция

сlose дескриптор_файла

закрывает файл, связанный с указанным дескриптором.

В состав языка Perl входят средства поиска и замены, причем, задавая шаблон для поиска, можно использовать регулярные выражения. Это значит, что сложные операции, встречающиеся в специализированных приложениях, можно легко реализовать в любой Perl-программе.

Оператор поиска m// записывается следующим образом:

m/шаблон/

Если значение переменной $_ содержит подстроку, соответствующую указанному шаблону, оператор поиска возвращает значение true.

Рассмотрим следующий пример:

$_ = <INPUT>; 
if (m/Scripts/)
{ print "В URL есть каталог Scripts \n"; } 
else
{ print " В URL нет каталога Scripts \n"; }

Оператор замены s/// записывается следующим образом:

s/шаблон поиска/выражение для замены/[набор модификаторов]

При выполнении оператора s/// производится поиск соответствия шаблону, и если поиск завершается успешно, найденная подстрока заменяется указанным выражением. Подобно оператору m//, оператор s/// использует переменную $_. Ниже приведен простейший пример применения оператора s///.

$_ =  "CGI-сценарий написан на языке С";
s/C$/Perl/;
print;

В результате выполнения сценария на консоль будет выведена следующая строка:

CGI-сценарий написан на языке Perl

Поскольку символ С содержится в аббревиатуре CGI, поэтому в шаблоне поиска указано, что он должен быть последним в строке.

За последним разделителем в операторе s/// могут следовать один или несколько модификаторов. Назначение некоторых модификаторов приведено ниже.

  • g - глобальный поиск. Если этот модификатор не указан, после обнаружения первого соответствия оператор s/// закончит свою работу. Поэтому при отсутствии модификатора g будет произведено не более одной замены.
  • i - указывает, что при поиске следует игнорировать регистр символов.
  • e - указывает, что последовательность символов для замены следует интерпретировать не как подстроку, а как выражение Perl.

В выражении для подстановки могут присутствовать переменные $1 - $9, и в этом случае необходимо указать модификатор е. Так, например, если требуется интерпретировать десятичное число как код символа, можно воспользоватъся следующим выражением:

s/([0-9]+)/chr($1)/e;

Чтобы поиск или замена производились в строке, содержащейся в нужной переменной, надо использовать следующее выражение:

Переменная  =~  оператор_поиска_или_замены

Так, например, для преобразования шестнадцатеричных чисел, содержащихся в переменной $string, в десятичное представление можно использовать инструкцию:

$string =~  s/([0-9A-Fa-f]+)(H|h)/hex($1)/ge;
Михаил Олифиренко
Михаил Олифиренко
Александр Табачук
Александр Табачук

Это только у меня не работает кнопочка "Получить код DreamSpark"? Пишет "временно не доступно..." А когда заработает?

Олег Огородников
Олег Огородников
Россия