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[источник не указан 442 дня].

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

Ларри Уолл

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

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

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

Особенности

[править | править код]

Общая структура 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 по наше время

[править | править код]

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 существовал исключительно в виде описания языка.

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

С 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 года.

Литература

[править | править код]