Perl
Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения. Название языка представляет собой аббревиатуру, которая расшифровывается как Practical Extraction and Report Language «практический язык для извлечения данных и составления отчётов».
История языка программирования Perl началась в 1987 году. Предпосылки к созданию послужили проблемы, возникшие при администрировании UNIX-систем, с которыми сталкивался программист Ларри Уолл. Задача состояла в разработке некой среды, которая создавала бы отчеты о содержании многочисленных текстовых файлов в UNIX – системе.
Сегодня основной для разработчиков является пятая версия языка Perl, однако продолжают использоваться программы (скрипты), написанные на предыдущей — четвёртой — версии (из-за частичной обратной несовместимости). Фактически стандарт языка определяется реализацией интерпретатора.
С 2000 года идет разработка новой (6-ой) версии языка. В отличие от предыдущих версий, разработчики планируют создать четко определенный стандарт языка.
Основной особенностью языка считаются его богатые возможности для работы с текстом, в том числе реализованные при помощи регулярных выражений. Перл унаследовал много свойств от языков Си, shell script, awk.
Perl также знаменит огромной коллекцией дополнительных модулей CPAN
Синтаксис
Первая строка исходного кода может начинаться с «#!/Путь/к/Perl [-ключи]» — что указывает системе путь к интерпретатору Perl для выполнения программы в UNIX системах и выполнения их на веб-сервере.Простейшая программа Hello world выглядит следующим образом:
print "Hello, world!\n";Типы данных
Основные типы данных: скаляр, массив, хеш-таблица, функция, запись таблицы символов (typeglob). Переменные разных типов отличаются знаком, который стоит перед именем переменной.
$foo; # скаляр или ссылка
@foo; # массив
%foo; # хеш-таблица
&foo; # функция
*FOO; # запись таблицы символов
• Скалярные переменные используются для хранения одиночных значений. Они могут содержать числа, строки и ссылки на другие объекты. Перед именем скалярной переменной необходимо ставить знак доллара '$'. Тип скалярной переменной не фиксирован (в отличие от, например, языка Си) и определяется динамически в зависимости от контекста. Например,
$x = 10; # число
$y = $x + 1; # используем $x как число…
$z = $x . 'string'; # … а теперь — как строку
$ref = \$x; # $ref является указателем на $x
$$ref = 0; # $x содержит значение 0
• Массив является упорядоченным списком скаляров. Каждый элемент массива имеет порядковый индекс, с помощью которого к нему можно получить доступ. Нумерация элементов начинается с нуля, то есть первый элемент списка имеет индекс 0. Перед именем переменной-массива необходимо ставить знак '@', а для доступа к определенному элементу массива использовать знак '$', так как определенный элемент массива является скаляром . Многомерные массивы можно смоделировать, помещая в список ссылки на другие списки.
@array = (1,2,3,4); # записали в массив @array четыре элемента
print $array[2]; # напечатать третий элемент
print @array[2,3]; # напечатать третий и четвертый элемент.
# Здесь используется @, так как результат операции среза массива тоже является массивом.
• Хеш-таблица представляет собой ассоциативный массив, позволяющий ассоциировать строку (называемую ключ) со скаляром (значение). Строка называется ключом, а скаляр в хеш-таблице значением. Перед именем переменной-списка необходимо ставить знак процента '%', а для доступа к определенному элементу массива необходимо ставить знак '$'.
Хеш-таблицу можно инициализировать массивом или списком, состоящим из неограниченного числа последовательностей (ключ, значение).
%hash = (• Функция представляет собой фрагмент исполняемого кода. Функция всегда возвращает какое-либо значение. Если возвращаемое значение явно не указано оператором return, возвращается последнее вычисленное значение. Если в функции используется return без параметров, то в зависимости от контекста вызова функции возвращается неопределённое значение undef, пустой список или вообще ничего.
'cat' => 'kitten', # здесь => - это так называемая "длинная запятая",
'dog' => 'puppy', # в этом примере по функции полностью аналогичная обыкновенной ",".
'cow' => 'calf'
);
print $hash{'cat'}; #Напечатает kitten
print join("-", keys %hash) ; # Вывод всех ключей. Напечатает cat-dog-cow
print join("-", values %hash) ; # Вывод всех значений. Напечатает kitten-puppy-calf
print join("-", %hash) ; # Напечатает cat-kitten-cow-calf-dog-puppy, так как в списковом контексте хэш автоматически
# разворачивается в список (ключ, значение). Так как ключи в хэше не сортируются,
# пары каждый раз будут выводиться в произвольном порядке.
sub printTwo{
print 2;
}
sub three{
3;
}
$s = \&three;
print &$s; #Напечатает 3
$s = \&printTwo; # Запишем в скаляр $s ссылку на функцию - через эту ссылку она будет вызвана в следующей строке.
print &$s; #Напечатает 21. `2` в коде функции, а `1` как значение, возвращаемое функцией printTwo
print &printTwo #То же самое
• Константа представляет собой неизменяемое значение. Константа не является встроенным типом языка и эмулируется при помощи функций. Предпочтительно задавать константы с помощью стандартного модуля constant, чтобы в будущем не зависеть от возможных изменений в реализации констант. Использование:
use constant MY => 2;
print MY;
• Запись таблицы символов. Специальный тип, в котором хранятся ссылки на все переменные других типов с таким названием, а также на символы, которые часто использует для хранения файловый дескриптор, представляющих собой указатель на файл, устройство или PIPE канал, открытые для записи, чтения или для записи и чтения.
Использование:
$s =В последних версиях Perl появилась возможность хранить файловые дескрипторы в скалярах, и в новых программах предпочтительно пользоваться именно этим способом.
; #Читаем одну строку из дескриптора STDIN (стандартный поток ввода); скалярный контекст.
@values =; #Читаем все строчки из некоторого открытого и связанного с дескриптором FILE файла; списковый контекст.
print STDOUT $s; #Печатаем в STDOUT (стандартный поток вывода)
Также таблицы символов используются для связи двух имён переменной с одним значением в памяти, создавая синонимы, которые могут быть использованы для доступа и модификации значения точно также как и оригинальное имя. Эта возможность является основой системы загружаемых модулей, классов и объектов в Perl.
Регулярные выражения
Важной частью Perl являются регулярные выражения. Благодаря этому Perl очень эффективен для обработки текстов. Бо?льшая часть работы с регулярными выражениями производится при помощи операторов =~, m// и s///.
Оператор m// используется для проверки на совпадение. В простейшем случае результат выражения $x =~ m/abc/ будет истинным, если и только если строка $x будет соответствовать регулярному выражению abc. Например:
$x =~ /abc/ Строка $x содержит (под)строку «abc». Начальная буква «m» оператора при использовании // может быть опущена.Поиск и замена выполняются при помощи оператора s///. Конструкция $x =~ s/abc/def/; заменит первое вхождение регулярного выражения abc на строку def.
$x =~ m/a(.{1,3})c/ Строка $x содержит букву «a», затем от одного до трех любых символов, и затем букву «c». Найденные символы
будут сохранены в переменную $1.
$x =~ m{^p(erl|ugs)$}i Строка $x строго равна «perl» или «pugs» без учета регистра. Так же, вместо // регулярное выражение окружено {}
$x =~ s/abc/def/g; Все вхождения (на что указывает флаг /g — global) подстроки «abc» в $x будут заменены на «def».Регулярные выражения Perl настолько популярны, что они включены напрямую в другие языки, такие как PHP и JavaScript, а также существуют подключаемые библиотеки, реализующие использование выражений в компилируемых языках.
$x =~ s/a(.{1,3})c/!$1!/; Первое вхождение в $x буквы «a», затем от одного до трех любых символов, и затем буквы «c» будет заменено на эти символы между «a» и «c», окружённые «!». Например, «syntactic» станет «synt!cti!».
$x =~ s{^p(erl|ugs)}{"P" . lc $1}ieg; Здесь показан пример использования модификатора /e, указывающего на то, что вместо строки замены будет написан код, результат выполнения которого надо использовать. Все вхождения «perl» или «pugs» в любом регистре будут заменены на «Perl» и «Pugs», соответственно.
Безопасность
В Perl строковые переменные содержат столько символов, сколько им присваивает скрипт. Perl не позволяет программе писать данные в одну переменную таким образом, чтобы нарушить целостность данных другой переменной. Имеется также специальная версия языка Perl, которую называют taintperl, в которой осуществляется проверка зависимостей между данными и предотвращается выполнение системой команд по передаче данных серверу от источника, не заслуживающего доверия. Если испорченные или некорректные данные поступают на вход программы taintperl, то она помечает все значения командной строки, переменных окружения и входные данные как испорченные, предотвращая их дальнейшую передачу серверу и возникновение фатальной ошибки.Преимущества:
• Универсальность: возможно использовать переменные многих, самых разнообразных типов данных• Perl распознает типы переменных по тому, где в структуре они используются, выделяя для каждой из них необходимое количество ресурсов памяти, когда ее значение изменяется, и применяя нужные операции в соответствии с ее типом.
• Свободный и гибкий синтаксис, позволяющий допускать множество мелких ошибок
• Кроссплатформенность - сценарий Perl будет работать одинаково, в какой бы системе вы его не запустили- Linux, Mac OS X, IRIX, Windows или FreeBSD.
Недостатки:
• Perl-программирование и установка скриптов на сервер - довольно трудоемкий процесс• Трудность изучения
• Программы, написанные на Perl, компилируются каждый раз во время выполнения