Perl язык программирования в честь кого назван

2007 Школа Википедия Выбор. Смежные дисциплины: Компьютерное программирование

Perl
Image:Programming-republic-of-perl.gif
Парадигма: Мультипарадигма
Появился в: 1987
Разработанный компанией: Ларри Уолл
Последний релиз: 5.8.8 / 31 января 2006 г.
Дисциплина машинописи: Динамический
Под влиянием: AWK, BASIC-PLUS, C, C++, Lisp, Pascal, sed, Unix shell
Под влиянием: Python, PHP, Ruby
ОС: Кросс-платформенный
Лицензия: GNU General Public License, Художественная лицензия
Веб-сайт: http://www.perl.org/

Perl-это динамический язык программирования. Разработанный

Ларри Уоллом и впервые выпущенный в 1987 году. Perl заимствует функции из множества других языков, включая C, shell scripting ( sh), AWK, sed и Lisp.

Структурно Perl основан на стиле блоков с фигурными скобками AWK и C и был широко принят за его сильные стороны в обработке строк и отсутствие произвольных ограничений многих скриптовых языков в то время.

История

Уолл начал работу над Perl в 1987 году. Работая программистом в

Unisys, и 18 декабря 1987 года выпустил версию 1.0 для группы новостей comp.sources.misc. В течение следующих нескольких лет язык быстро расширялся. Perl 2, выпущенный в 1988 году. Отличался лучшим механизмом регулярных выражений. Perl 3, выпущенный в 1989 году. Добавил поддержку двоичных данных.

До 1991 года единственной документацией для Perl была одна (все более и более длинная) man-страница. В 1991 году была опубликована книга программирования Perl (the Camel Book). Ставшая фактическим справочником для этого языка. В то же время номер версии Perl был увеличен до 4, не для того. Чтобы отметить значительное изменение языка. А чтобы идентифицировать версию. Которая была задокументирована в книге.

Perl 4 прошел через серию ремонтных релизов. Кульминацией которых стал Perl 4.036 в 1993 году. В этот момент Ларри Уолл отказался от Perl 4, чтобы начать работу над Perl 5. Perl 4 остается в версии 4.036 и по сей день.

Разработка Perl 5 продолжалась вплоть до 1994 года. Список рассылки perl5-porters был создан в мае 1994 года для координации работы по портированию Perl 5 на различные платформы. Он остается основным форумом для разработки. Обслуживания и переноса Perl 5.

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

26 октября 1995 года была создана Всеобъемлющая архивная сеть Perl (CPAN). CPAN-это набор веб-сайтов. Которые архивируют и распространяют источники Perl. Двоичные дистрибутивы. Документацию. Сценарии и модули.

По состоянию на 2006 год Perl 5 все еще активно поддерживается. По пути были добавлены важные функции и некоторые существенные новые языковые конструкции. Включая поддержку Unicode, потоки. Улучшенную поддержку объектно-ориентированного программирования и многие другие усовершенствования. Последняя стабильная версия-Perl 5.8.8.

Имя

Первоначально Перл был назван Притчи о Жемчужине. Ларри Уолл хотел дать языку короткое название с положительными коннотациями; он утверждает. Что посмотрел (и отверг) каждое трех — и четырехбуквенное слово в словаре. Он также подумывал о том. Чтобы назвать его в честь своей жены Глории. Уолл обнаружил существующий язык программирования PEARL еще до официального выпуска Perl и изменил написание его названия.

Имя обычно пишется с заглавной буквы (Perl) при обращении к языку и без заглавной буквы (perl) при обращении к самой программе интерпретатора. Так как Unix-подобные файловые системы чувствительны к регистру. До выхода первого издания Programming Perl было принято называть язык как perl; Рэндал Л. Шварц, однако. Заглавными буквами название языка в книге. Чтобы сделать его лучше выделяться при наборе текста. Это различение случаев было впоследствии принято сообществом.

Иногда это название дается как Practical Extraction и Report Language). Хотя это расширение преобладает во многих современных руководствах. Включая официальную справочную страницу Perl. Оно является бэкронимом. И официально это название ничего не означает. Таким образом. Написание PERL во всех заглавных буквах используется в качестве шибболета для обнаружения аутсайдеров сообщества. Было предложено несколько других бэкронимов. В том числе юмористический Патологически эклектичный Мусорный Листер.

Символ верблюда

Perl обычно символизируется верблюдом. Что стало результатом изображения . Выбранного издателем O’Reilly Media для обложки Programming Perl, которая впоследствии получила название The Camel Book. О’Рейли владеет символом как товарным знаком. Но утверждает. Что использует свои юридические права только для защиты . O’Reilly позволяет некоммерческое использование символа и обеспечивает программирование логотипов Perl (см. Выше) и питание от кнопок Perl.

Общие сведения

Perl-это универсальный язык программирования. Первоначально разработанный для работы с текстом. А теперь используемый для широкого спектра задач. Включая системное администрирование. Веб-разработку. Сетевое программирование. Разработку графического интерфейса и многое другое.

Язык должен быть практичным (простым в использовании. Эффективным, полным). А не красивым (крошечным. Элегантным. Минимальным). Его основные функции включают поддержку нескольких парадигм программирования ( процедурный, объектно-ориентированный и функциональный стили). Автоматическое управление памятью. Встроенную поддержку обработки текста и большую коллекцию сторонних модулей.

Характеристики

Perl является процедурным языком с переменными, выражениями, операторами присваивания, кодовыми блоками. Разделенными фигурными скобками, управляющими структурами и подпрограммами.

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

Perl берет списки из Lisp, ассоциативные массивы (хэши) из AWK и регулярные выражения из sed. Они упрощают и облегчают многие задачи анализа. Обработки текста и управления данными.

В Perl 5 были добавлены функции. Поддерживающие сложные структуры данных, первоклассные функции (т. Е. Замыкания в качестве значений) и объектно-ориентированную модель программирования. К ним относятся ссылки. Пакеты. Отправка методов на основе классов и переменные лексической области. А также директивы компилятора (например, строгая директива pragma). Основной дополнительной функцией, введенной с Perl 5, была возможность упаковывать код в виде многоразовых модулей. Ларри Уолл позже заявил, что

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

Дизайн

Дизайн Perl можно понять как ответ на три широкие тенденции в компьютерной индустрии: снижение затрат на аппаратное обеспечение. Рост затрат на рабочую силу и совершенствование технологии компиляторов. Многие более ранние компьютерные языки. Такие как Fortran и C. Были разработаны для эффективного использования дорогостоящего компьютерного оборудования. В отличие от этого. Perl предназначен для эффективного использования дорогостоящих компьютерных программистов.

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

Уолл учился на лингвиста. И дизайн Perl в значительной степени основан на лингвистических принципах. Примеры включают кодирование Хаффмана (общие конструкции должны быть короткими). Хороший конечный вес (важная информация должна быть на первом месте) и большую коллекцию языковых примитивов. Perl отдает предпочтение языковым конструкциям. Которые являются естественными для чтения и записи людьми. Даже если они усложняют интерпретатор Perl.

Синтаксис Perl отражает идею о том. Что Например, скаляры. Массивы и хэши имеют разные начальные сигилы. Индексы массивов и хэш-ключи используют различные виды фигурных скобок. Строки и регулярные выражения имеют разные стандартные разделители. Этот подход можно противопоставить таким языкам, как Lisp. Где одна и та же конструкция S-выражения и базовый синтаксис используются для самых разных целей.

Perl не навязывает какую-либо конкретную парадигму программирования (процедурную. Объектно-ориентированную. Функциональную и т. Д.) и даже не требует от программиста выбора между ними.

Существует широкая практическая склонность как к языку Perl. Так и к сообществу и культуре. Которые его окружают. Предисловие к программированию Perl Одним из следствий этого является то. Что Perl не является аккуратным языком. Он включает в себя функции. Если люди их используют. Допускает исключения из своих правил и использует эвристику для разрешения синтаксических двусмысленностей. Из-за снисходительной природы компилятора иногда бывает трудно найти ошибки. Обсуждая вариативное поведение встроенных функций в списковом и скалярном контекстах. На странице руководства perlfunc(1) говорится:

У Perl есть несколько девизов. Которые передают аспекты его дизайна и использования. Один из них — Есть более чем один способ сделать это (TMTOWTDI. Обычно произносится как Другие — и . Заявленная цель дизайна Perl состоит в том. Чтобы сделать простые задачи легкими. А сложные-возможными. Perl также называют .

Приложения

Perl имеет множество разнообразных приложений. Что усугубляется наличием множества стандартных и сторонних модулей.

Perl использовался с первых дней Интернета для написания CGI-скриптов. Он известен как один из Python и PHP). Которые являются наиболее популярными скриптовыми языками для создания веб-приложений. И является неотъемлемым компонентом популярного стека решений LAMP для веб-разработки. Крупные проекты. Написанные на Perl. Включают Slash, IMDb и UseModWiki, ранний. Влиятельный вики-движок. Многие сайты с высоким трафиком. Такие как Amazon.com и Ticketmaster.com используйте Perl экстенсивно.

Perl часто используется в качестве связующего языка. Связывающего воедино системы и интерфейсы. Которые не были специально разработаны для взаимодействия. А также для На самом деле эти сильные стороны тесно связаны. Эта комбинация делает perl популярным универсальным инструментом для системных администраторов. Особенно потому. Что короткие программы можно вводить и запускать в одной командной строке.

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

Реализация

Perl реализован как основной интерпретатор. Написанный на C. Вместе с большой коллекцией модулей. Написанных на Perl и C. Исходный дистрибутив по состоянию на 2005 год составляет 12 МБ, если он упакован в файл tar и сжатый. Интерпретатор состоит из 150 000 строк кода на языке Си и компилируется в исполняемый файл размером 1 МБ на типичных машинных архитектурах. Кроме того, интерпретатор может быть скомпилирован в библиотеку ссылок и встроен в другие программы. В дистрибутиве имеется почти 500 модулей. Включающих 200 000 строк Perl и еще 350 000 строк кода на языке Си. Большая часть кода C в модулях состоит из таблиц кодирования символов.

Интерпретатор имеет объектно-ориентированную архитектуру. Все элементы языка Perl—скаляры. Массивы, хэши. Кодовые коды. Дескрипторы файлов—представлены в интерпретаторе структурами языка Си. Операции над этими структурами определяются большим набором макросов. Typedef и функций; они составляют Perl C API. Perl API может сбить с толку непосвященных. Но его точки входа следуют последовательной схеме именования. Которая дает рекомендации тем. Кто ее использует.

Выполнение программы на языке Perl обычно делится на две фазы: время компиляции и время выполнения. Во время компиляции интерпретатор анализирует текст программы в виде синтаксического дерева. Во время выполнения он выполняет программу. Идя по дереву. Текст анализируется только один раз. И синтаксическое дерево подвергается оптимизации перед его выполнением. Поэтому фаза выполнения является относительно эффективной. Оптимизация синтаксического дерева во время компиляции включает в себя постоянное сворачивание и распространение контекста, но также выполняется оптимизация глазка. Однако фазы компиляции и выполнения могут гнездиться: BEGIN блоки кода выполняются во время компиляции. В то время evalкак функция инициирует компиляцию во время выполнения. Обе операции подразумеваются в ряде других — в частности, в useпредложении. Которое загружает библиотеки. Известные в Perl как модули. Подразумевается BEGINблок.

Perl является динамическим языком и имеет контекстно-зависимую грамматику. На которую может влиять код. Выполняемый во время прерывистой фазы выполнения. (См. Примеры. ) Поэтому Perl не может быть проанализирован прямой комбинацией Lex/ Yacc lexer/parser. Вместо этого интерпретатор реализует свой собственный лексер. Который координируется с модифицированным синтаксическим анализатором GNU bison для разрешения двусмысленностей в языке. Говорят, что Perl (perl) может анализировать язык Perl (PerlОб истинности этого свидетельствуют постоянные несовершенства других программ. Берущихся за разбор Perl. Таких как анализаторы исходного кода и автоиндентеры. Которым приходится бороться не только со многими способами выражения однозначных синтаксических конструкций. Но и с тем фактом. Что Perl не может быть разобран в общем случае без его выполнения.

Обслуживание Perl-переводчика с годами становится все сложнее. Кодовая база находится в постоянном развитии с 1994 года. Код был оптимизирован для производительности за счет простоты. Ясности и сильных внутренних интерфейсов. Были добавлены новые функции. Но при этом поддерживается практически полная обратная совместимость с более ранними версиями. Размер и сложность интерпретатора является барьером для разработчиков. Которые хотят работать над ним.

Perl распространяется с примерно 120 000 функциональными тестами. Они выполняются как часть обычного процесса сборки и интенсивно тренируют интерпретатор и его основные модули. Разработчики Perl полагаются на функциональные тесты. Чтобы гарантировать. Что изменения в интерпретаторе не приведут к ошибкам; и наоборот. Пользователи Perl. Которые видят. Что интерпретатор проходит свои функциональные тесты в своей системе. Могут иметь высокую степень уверенности в том. Что он работает правильно.

Нет никакой письменной спецификации или стандарта для языка Perl. И никто не планирует создавать его для текущей версии Perl. Существует только одна реализация интерпретатора. Этот интерпретатор вместе со своими функциональными тестами выступает как фактическая спецификация языка.

Доступность

Perl является свободным программным обеспечением и лицензируется как по художественной лицензии. Так и по общей публичной лицензии GNU. Дистрибутивы доступны для большинства операционных систем. Он особенно распространен в Unix и Unix-подобных системах. Но он был перенесен на большинство современных (и многих устаревших) платформ. Только с шестью сообщенными исключениями Perl может быть скомпилирован из исходного кода на всех Unix-подобных, POSIX-совместимых или других Unix-совместимых платформах. Однако это редко бывает необходимо. Так как Perl включен в установку по умолчанию многих популярных операционных систем.

Из-за специальных изменений. Необходимых для поддержки Mac OS Classic. Специальный порт под названием MacPerl был отправлен независимо.

Windows

Пользователи Microsoft Windows обычно устанавливают собственный двоичный дистрибутив Perl. Компиляция Perl из исходного кода под Windows возможна. Но в большинстве установок отсутствует необходимый компилятор C.

Уровень эмуляции Cygwin обеспечивает еще один способ запуска Perl под Windows. Cygwin предоставляет Unix-подобную среду в Windows. Которая включает gcc, поэтому компиляция Perl из исходного кода является более доступным вариантом для пользователей. Использующих этот подход.

В июне 2006 года win32.perl.org был запущен Адамом Кеннеди от имени Фонд Perl. Это сайт сообщества для

Структура языка

В Perl каноническая программа Hello world обычно формулируется следующим образом:

#!/usr/bin/perl -w use strict; выведите 

Первая строка-это shebang. Который сообщает операционной системе. Где найти интерпретатор Perl. Вторая строка вводит строгую прагму. Которая используется во многих крупных программных проектах для контроля качества. Третий печатает строку Hello. World! и новая линия. Далее следует комментарий ( ‘\n’ — это ‘newline’ ).

# sign в третьей строке-это токен комментария# sign. Вплоть до конца строки кода.

Shebang-это обычный способ вызова интерпретатора в системах Unix. Системы Windows могут полагаться на shebang или связывать расширение файла .pl с интерпретатором Perl. Некоторые текстовые редакторы также используют строку shebang как подсказку о том. В каком режиме работать. Если программа выполняется perl и не вызывается через оболочку, строка. Начинающаяся с shebang. Анализируется на наличие опций и в противном случае игнорируется. Дополнительные сведения см. на справочной странице perlrun.

Следует отметить. Что, как Перл , не используя строгие. И как использовать строгие ограничения не обязательно для использовать строго в это. Чтобы избежать потенциально кричал на другие программисты не использовать строгий.

Кроме того. Поскольку вполне возможно вызвать интерпретатор perl непосредственно из командной строки и. Кроме того. Поскольку строка ‘shebang’ не является частью Perl. А является требованием некоторых оболочек (и рассматривается perl как комментарий). Строка shebang также фактически не является необходимой. Действительно. В большинстве реализаций Win32 это совершенно бесполезно.

Наконец, нет необходимости в пояснительных комментариях внутри демонстративной программы Кроме того. Последняя строка любого блока кода в программе Perl. Которая включает в себя подразумеваемый блок вокруг всего сценария. На самом деле не нуждается в терминаторе точки с запятой.

Таким образом. На самом деле в Perl каноническая программа Hello world

печать 

и это все.

Типы данных

Perl имеет четыре основных типа данных: скаляры, списки, хэши и дескрипторы файлов:

  • Скаляр-это единственное значение; это может быть число, строка или ссылка
  • Список-это упорядоченная коллекция скаляров (переменная. Содержащая список. Называется массивом)
  • Хэш, или ассоциативный массив. Представляет собой карту от строк к скалярам; строки называются ключами, а скаляры-значениями.
  • Файловая ручка — это карта к файлу, устройству или каналу, который открыт для чтения, записи или и того, и другого.

Все переменные помечены ведущим сигиллом. Который определяет тип данных. К которому осуществляется доступ (а не тип самой переменной). За исключением файловых хэндлов. Которые не являются таковыми. Одно и то же имя может использоваться для переменных разных типов. Без конфликтов.

 $foo # a scalar @foo # массив %foo # a hash foo # a Filehandle. Но хорошие программисты используют FOO, а не foo. 

Числа записываются обычным способом. Строки заключаются в кавычки различного рода.

 $n = 42; $name = $color = 'красный'; $animal = qq!лягушка!; 

Perl преобразует строки в числа и наоборот в зависимости от контекста. В котором они используются. В следующем примере строки $n и $m рассматриваются как числа. Когда они являются аргументами оператора сложения. Этот код печатает число (Оператор конкатенации строк не +является , но.)

 $n = "3 apples"; $m = "2 oranges"; print $n + $m; 

Perl also has a boolean context that it uses in evaluating conditional statements. The following values all evaluate as false in Perl:

 $false = 0; # the number zero $false = 0.0; # the number zero as a float $false = '0'; # the string zero $false = ""; # the empty string $false = undef; # the return value from undef 

All other values are evaluated to true. This includes the odd self-describing string of «0 but true», which in fact is 0 as a number, but true when used as a boolean. (Any non-numeric string would also have this property, but this particular string is ignored by Perl with respect to numeric warnings.) A less explicit but more conceptually portable version of this string is ‘0E0’ or ‘0e0’, which does not rely on characters being evaluated as 0, as ‘0E0’ is literally «zero to the exponent of zero.»

Evaluated boolean expressions also return scalar values. Although the documentation does not promise which particular true or false is returned (and thus cannot be relied on). Many boolean operators return 1 for true and the empty-string for false (which evaluates to zero in a numeric context). The defined() function tells if the variable has any value set. In the above examples defined($false) is true for every value except undef.

If a specifically 1 or 0 result (as in C) is needed. An explicit conversion is thought by some authors to be required:

 my $real_result = $boolean_result ? 1 : 0; 

However, an implicit conversion can be used instead:

 my $real_result = $boolean_result + 0; 

A list is written by listing its elements. Separated by commas. And enclosed by parentheses where required by operator precedence.

 @scores = (32, 45, 16, 5); 

Or, then again. It can be written some other half dozen ways, at least:

 @scores = qw(32 45 16 5); @scores = split /-/, '32-45-16-5'; push @scores, $_ for 32, 45, 16, 5; 

A hash may be initialized from a list of key/value pairs.

 %favorite = (joe => 'red'. Sam => 'blue'); 

Or it may simply be defined piece by piece:

 $favourite{joe} = 'red'; $favourite{sam} = 'blue'; 

Individual elements of a list are accessed by providing a numerical index. In square brackets. Individual values in a hash are accessed by providing the corresponding key. In curly braces. The $ sigil identifies the accessed element as a scalar.

 $scores[2] # an element of @scores $favorite{joe} # a value in %favorite 

Multiple elements may be accessed by using the @ sigil instead (identifying the result as a list).

 @scores[2, 3, 1] # three elements of @scores @favorite{'joe'. 'sam'} # two values in %favorite 

The number of elements in an array can be obtained by evaluating the array in scalar context or with the help of the $# sigil. The latter gives the index of the last element in the array. Not the number of elements.

 $count = @friends; $#friends # the index of the last element in @friends $#friends+1 # usually the number of elements in @friends # this is one more than $#friends because the first element is at # index 0, not 1. Unless the programmer reset this to a # different value. Which most Perl manuals encourage her # not to do. 

There are a few functions that operate on entire hashes.

 @names = keys %address; @addresses = values %address; 1 while ($name. $address) = each %address; 

Control structures

Perl has several kinds of control structures.

It has block-oriented control structures. Similar to those in the C and Java programming languages. Conditions are surrounded by parentheses. And controlled blocks are surrounded by braces:

label while ( cond ) { ... } label while ( cond ) { ... } continue { ... } label for ( init-expr ; cond-expr ; incr-expr ) { ... } label foreach var ( list ) { ... } label foreach var ( list ) { ... } continue { ... } if ( cond ) { ... } if ( cond ) { ... } else { ... } if ( cond ) { ... } elsif ( cond ) { ... } else { ... } 

Where only a single statement is being controlled. Statement modifiers provide a lighter syntax:

statement if cond ; statement unless cond ; statement while cond ; statement until cond ; statement foreach list ; 

Short-circuit logical operators are commonly used to effect control flow at the expression level:

expr and expr expr or expr 

The flow control keywords next, last, return, and redo are expressions. So they can be used with short-circuit operators.

Perl also has two implicit looping constructs:

 results = grep { ... } list results = map { ... } list 

grep returns all elements of list for which the controlled block evaluates to true. map evaluates the controlled block for each element of list and returns a list of the resulting values. These constructs enable a simple functional programming style.

There is no switch statement (multi-way branch) in Perl 5. The Perl documentation describes a half-dozen ways to achieve the same effect by using other control structures. There is a Switch module, however. Which provides functionality modeled on the forthcoming Perl 6 re-design.

Perl includes a goto label statement. But it is rarely used. Situations where a goto is called for in other languages don’t occur as often in Perl due to its breadth of flow control options.

There is also a goto &sub statement that performs a tail call. It terminates the current subroutine and immediately calls the specified sub. This is used in situations where a caller can perform more efficient stack management than Perl itself (typically because no change to the current stack is required). And in deep recursion tail calling can have substantial positive impact on performance because it avoids the overhead of scope/stack management on return.

Subroutines

Subroutines are defined with the sub keyword. And invoked simply by naming them. If the subroutine in question has not yet been declared. Parentheses are required for proper parsing.

foo(); # parentheses required here... sub foo { ... } foo; # ... but not here 

A list of arguments may be provided after the subroutine name. Arguments may be scalars, lists, or hashes.

foo $x, @y, %z; 

The parameters to a subroutine need not be declared as to either number or type; in fact. They may vary from call to call. Arrays are expanded to their elements. Hashes are expanded to a list of key/value pairs. And the whole lot is passed into the subroutine as one undifferentiated list of scalars.

Whatever arguments are passed are available to the subroutine in the special array @_. The elements of @_ are aliased to the actual arguments; changing an element of @_ changes the corresponding argument.

Elements of @_ may be accessed by subscripting it in the usual way.

$_[0], $_[1] 

However, the resulting code can be difficult to read. And the parameters have pass-by-reference semantics. Which may be undesirable.

One common idiom is to assign @_ to a list of named variables.

my($x, $y, $z) = @_; 

This effects both mnemonic parameter names and pass-by-value semantics. The my keyword indicates that the following variables are lexically scoped to the containing block.

Another idiom is to shift parameters off of @_. This is especially common when the subroutine takes only one argument.

my $x = shift; 

Subroutines may return values.

return 42, $x, @y, %z; 

If the subroutine does not exit via a return statement. Then it returns the last expression evaluated within the subroutine body. Arrays and hashes in the return value are expanded to lists of scalars. Just as they are for arguments.

The returned expression is evaluated in the calling context of the subroutine; this can surprise the unwary.

sub list { (4, 5, 6) } sub array { @x = (4, 5, 6); @x } $x = list; # returns 6 - last element of list $x = array; # returns 3 - number of elements in list @x = list; # returns (4, 5, 6) @x = array; # returns (4, 5, 6) 

A subroutine can discover its calling context with the wantarray function.

sub either { wantarray ? (1, 2) : "Oranges" } $x = either; # returns "Oranges" @x = either; # returns (1, 2) 

Regular expressions

The Perl language includes a specialized syntax for writing regular expressions (REs). And the interpreter contains an engine for matching strings to regular expressions. The regular expression engine uses a backtracking algorithm. Extending its capabilities from simple pattern matching to string capture and substitution. The regular expression engine is derived from regex written by Henry Spencer.

The Perl regular expression syntax was originally taken from Unix Version 8 regular expressions. However, it diverged before the first release of Perl. And has since grown to include many more features. Other languages and applications are now adopting Perl compatible regular expressions over POSIX regular expressions including PHP, Ruby, Java. And the Apache HTTP server.

The m// (match) operator introduces a regular expression match. (The leading m may be omitted for brevity.) In the simplest case. An expression like

 $x =~ m/abc/ 

evaluates to true if and only if the string $x matches the regular expression abc.

Portions of a regular expression may be enclosed in parentheses; corresponding portions of a matching string are captured. Captured strings are assigned to the sequential built-in variables $1, $2, $3, ..., and a list of captured strings is returned as the value of the match.

 $x =~ m/a(.)c/; # capture the character between 'a' and 'c' 

The s/// (substitute) operator specifies a search and replace operation:

 $x =~ s/abc/aBc/; # upcase the b 

Perl regular expressions can take modifiers. These are single-letter suffixes that modify the meaning of the expression:

 $x =~ m/abc/i; # case-insensitive pattern match $x =~ s/abc/aBc/g; # global search and replace 

Regular expressions can be dense and cryptic. This is because regular expression syntax is extremely compact. Generally using single characters or character pairs to represent its operations. Perl provides some relief from this problem with the /x modifier. Which allows programmers to place whitespace and comments inside regular expressions:

 $x =~ m/a # match 'a' . # match any character c # match 'c' /x; 

One common use of regular expressions is to specify delimiters for the split operator:

 @words = split m/,/. $line; # divide $line into comma-separated values 

The split operator complements string capture. String capture returns the parts of a string that match a regular expression; split returns the parts that don’t match.

Database interfaces

Perl is widely favored for database applications. Its text handling facilities are good for generating SQL queries; arrays. Hashes and automatic memory management make it easy to collect and process the returned data.

In early versions of Perl. Database interfaces were created by relinking the interpreter with a client-side database library. This was somewhat clumsy; a particular problem was that the resulting perl executable was restricted to using just the one database interface that it was linked to. Also, relinking the interpreter was sufficiently difficult that it was only done for a few of the most important and widely used databases.

In Perl 5, database interfaces are implemented by Perl DBI modules. The DBI (Database Interface) module presents a single. Database-independent interface to Perl applications. While the DBD:: (Database Driver) modules handle the details of accessing some 50 different databases. There are DBD:: drivers for most ANSI SQL databases.

Comparative performance

The «Computer Language Shootout Benchmarks» compare the performance of implementations of typical programming problems in several programming languages. Their Perl implementations typically took up more memory than implementations in other languages. And had varied speed results. Perl’s performance in the shootout is similar to other interpreted languages such as Python. PHP and Ruby. But slower than most compiled languages.

Perl can be slower than other languages doing the same thing because it has to compile the source every time it runs. In «A Timely Start». Jean-Louis Leroy found that his Perl scripts took much longer to run than he expected because the perl interpreter spent much of the time finding and compiling modules. Since most Perl programmers do not know how to save its intermediate result as Java, Python. And Ruby do easily. Perl scripts pay this overhead penalty on every execution. The overhead is not such a problem when amortized over a long run phase. But can significantly skew measurement of very short execution times as often found in benchmarks. Once perl starts the run phase, however. It can be quite fast and will typically outperform other dynamic languages. Technologies such as mod_perl overcome this by holding the compiled program in memory between multiple runs, or Class::Autouse to delay compiling of parts of the program until needed.

Optimizing

Nicholas Clark. A Perl core developer. Discusses some Perl design trade-offs and some solutions in «When perl is not quite fast enough». The most critical routines of a Perl program can be written in other languages such as C or Assembler via XS or Inline.

Optimizing Perl can require intimate knowledge of its workings rather than skill with the language and its syntax. Meaning that the problem is with the implementation of Perl rather than the language itself. Perl 6, the next major version. Will address some of these lessons that other languages have already learned.

Future

At the 2000 Perl Conference, Jon Orwant made a case for a major new language initiative. This led to a decision to begin work on a redesign of the language. To be called Perl 6. Proposals for new language features were solicited from the Perl community at large. And over 300 RFCs were submitted.

Larry Wall spent the next few years digesting the RFCs and synthesizing them into a coherent framework for Perl 6. He has presented his design for Perl 6 in a series of documents called apocalypses. Which are numbered to correspond to chapters in Programming Perl («The Camel Book»). The current. Unfinalized specification of Perl 6 is encapsulated in design documents called Synopses. Which are numbered to correspond to Apocalypses.

Perl 6 is not intended to be backward compatible. Though there will be a compatibility mode.

In 2001, it was decided that Perl 6 would run on a cross-language virtual machine called Parrot. This will mean that other languages targeting the Parrot will gain native access to CPAN and will allow some level of cross-language development.

In 2005 Audrey Tang created the pugs project. An implementation of Perl 6 in Haskell. This was and continues to act as a test platform for the Perl 6 language (separate from the development of the actual implementation) allowing the language designers to explore. The pugs project spawned an active Perl/Haskell cross-language community centered around the Freenode #perl6 irc channel.

A number of features in the Perl 6 language now show similarities with Haskell. And Perl 6 has been embraced by the Haskell community as a potential scripting language.

As of 2006, Perl 6, Parrot. And pugs are under active development. And a new module for Perl 5 called v6 allows some Perl 6 code to run directly on top of Perl 5.

In 2006, an effort was started to have Windows Perl distributions ship with a compiler. In order to make the need for binary packages on Windows redundant. Some early results of this include the CamelPack macro-installer and Vanilla Perl distributions.

Fun with Perl

Perl has a strong culture with many traditions. Several of which are practiced purely for recreational value.

As with C, obfuscated code competitions are the most well-known pastime. The annual Obfuscated Perl contest made an arch virtue of Perl’s syntactic flexibility. The following program prints the text «Just another Perl / Unix hacker». Using 32 concurrent processes coordinated by pipes. A complete explanation is available on the author’s Web site.

 @P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{ @p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord ($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&& close$_}%p;wait until$?;map{/^r/&&}%p;$_=$d[$q];sleep rand(2)if/\S/;print 

This is also an example of a discipline similar to obfuscated code. But somewhat distinct from it. Known as the «JAPH.» In the parlance of Perl culture. Perl programmers are known as Perl hackers. And from this derives the practice of writing short programs to print out the phrase « Just another Perl hacker,». In the spirit of the original concept. These programs are moderately obfuscated and short enough to fit into the signature of an email or Usenet message. The «canonical» JAPH includes the comma at the end. Although this is often omitted. Many variants on the theme have been created, eg. , which prints «Just Another Perl Pirate!».

Another popular diversion is «Perl Golf,» which has the same goal as the physical sport: to reduce the number of strokes that it takes to complete a particular objective. In this context. «strokes» refers to keystrokes. Rather than swings of a golf club. Objectives are narrowly defined non-trivial tasks. Such as «scan an input string and return the longest palindrome that it contains.» Participants try to outdo each other by writing solutions that require ever fewer characters of Perl source code.

Similar to obfuscated code and golf. But with a different purpose. Perl poetry is the practice of writing poems that can actually be compiled as legal (although generally non-sensical) Perl code. This hobby is more or less unique to Perl due to the large number of regular English words used in the language. New poems are regularly published in the Perl Monks site’s Perl Poetry section. Part of Perl lore is Black Perl. An infamous example of Perl poetry.

There are also many examples of code written purely for entertainment on the CPAN. Examples include the module Lingua::Romana::Perligata , which allows writing programs in Latin. Upon execution of such a program. The module translates its source code into regular Perl and runs it.

The Perl community has set aside the « Acme» namespace for modules that are fun in nature (but its scope has widened to include exploratory or experimental code or any other module that is not meant to ever be used in production). Some of the Acme modules are deliberately implemented in amusing ways. Some examples:

  • Acme::Bleach, one of the first modules in the Acme:: namespace. Allows the program’s source code to be «whitened» (i.e.. All characters replaced with whitespace) and yet still work. This is an example of a source filter. There are also a number of other source filters in the Acme namespace.
  • Acme::Hello simplifies the process of writing a «Hello, World!» program
  • Acme::Currency allows you to change the «$» prefix for scalar variables to some other character
  • Acme::ProgressBar is a purposefully horribly inefficient way to indicate progress for a task
  • Acme::VerySign satirizes the widely-criticized VeriSign Site Finder service
  • Acme::Don’t implements the logical opposite of the do keyword: the don't keyword. Which takes a block that it does not execute. (It should be noted that when using this. Don’t{ … } does not do the same thing as do not { … }. It doesn’t not, either.)