Perl
Practical Extraction and Report Language - язык PERL - свободно распространяемый интерпретируемый язык. Создан Ларри Уоллом (Larry Wall) в 1986 г. Обычно используется для создания динамически генирируемых веб-страниц. Используется также системными администраторами и веб-мастерами для работы и изменения текстов, файлов и процессов.
Содержание |
Perl - интерпретируемый язык, приспособленный для обработки произвольных текстовых файлов, извлечения из них необходимой информации и выдачи сообщений. Perl также удобен для написания различных системных программ. Этот язык прост в использовании, эффективен, но про него трудно сказать, что он элегантен и компактен. Perl сочитает в себе лучшие черты C, shell, sed и awk, поэтому для тех, кто знаком с ними, изучение Perl-а не представит особого труда. Cинтаксис выражений Perl-а близок к синтаксису C. В отличие от большинства утилит ОС UNIX Perl не ставит ограничений на объем обрабатываемых данных и если хватает ресурсов, то весь файл обрабатывается как одна строка. Рекурсия может быть произвольной глубины. Хотя Perl приспособлен для обработки текстовых файлов, он может обрабатывать так же двоичные данные и создавать .dbm файлы, подобные ассоциативным массивам. Perl позволяет использовать регулярные выражения, создавать объекты, вставлять в программу на С или C++ куски кода на Perl-е, а также позволяет осуществлять доступ к базам данных, в том числе Oracle.
Этот язык часто используется для написания CGI-модулей, которые, в свою очередь, могут обращаться к базам данных. Таким образом может осуществляться доступ к базам данных через WWW.
2024: Perl 5.40
10 июня 2024 года стало известно о том, что после 11 месяцев разработки опубликован релиз обновленной стабильной ветки языка программирования Perl - 5.40. При подготовке выпуска было изменено около 160 тыс. строк кода (без документации и автоматически сгенерированного кода - 110 тысяч), изменения затронули 1500 файлов, в разработке приняли участие 75 разработчиков.
Как сообщалось, ветка 5.40 выпущена в соответствии с утверждённым одиннадцать лет назад фиксированным графиком разработки, подразумевающим выпуск стабильных веток раз в год и корректирующих релизов - раз в три месяца. Примерно в июле 2024 года планируется выпустить первый корректирующий релиз Perl 5.40.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.40.0. Одновременно с выходом Perl 5.40 прекращена поддержка ветки 5.36, для которой обновления могут быть выпущены в будущем только в случае выявления критических проблем с безопасностью. 20 июня начнётся процесс разработки экспериментальной ветки 5.41, на базе которой в мае или июне 2025 года будет сформирован стабильный релиз Perl 5.42, если не будет принято решение перейти к нумерации 7.x.
Ключевые изменения:
- Расширены возможности, связанные с появившемся в прошлой версии экспериментальным синтаксисом для создания классов. Добавлено ключевое слово "CLASS", которое при вызове из методов, блоков ADJUST или при инициализации полей возвращает имя текущего класса по аналогии с тем как ключевое слово "PACKAGE" возвращает имя пакета. В отличие от выражения ref($self) ключевое слово "CLASS"может применяться при инициализации полей для доступа к методам класса на этапе до завершения создания экземпляра класса. Для базового класса значение "CLASS" идентично значению "PACKAGE", но будет отличаться при создании подклассов.
- Для определяемых внутри класса полей реализован атрибут ":reader", применяемый для автоматического создания метода, возвращающего значение переменной из поля в текущем экземпляре класса. Например, указание ":reader" после определения поля "field $s;" эквивалентно созданию метода "method s () { return $s; }". При необходимости можно задать не совпадающее имя метода при помощи конструкции вида "field $name :reader(get_name);".
- Объявлен стабильным синтаксис обработки исключений try/catch, который можно использовать вместо неочевидных манипуляций с "eval". Блок "try" включает блок с выполняемым кодом, а блок "catch" с кодом для обработки любого исключения, которое может возникнуть при выполнении первого блока. В "catch" определяется переменная, содержащая данные, переданные при формировании исключения (например, при срабатывании исключения на вызов "die" будет передана указанная в качестве аргумента строка). Внутри блоков "try" и "catch" разрешены операторы переходов, включая return, goto, next, last и redo.
- Стабилизирован синтаксис "for my (VAR, VAR) (LIST)" и "foreach my (VAR, VAR) (LIST)", применяемый для перебора списков с единовременным извлечением сразу нескольких значений в одной итерации цикла.
- Объявлен стабильным модуль builtin, включающий всегда доступные функции, встроенные в интерпретатор. На июнь 2024 года в модуле предложены функции true, false, weaken, unweaken, is_weak, blessed, refaddr, reftype, ceil, floor, is_tainted, trim и indexed.
- Добавлены экспериментальные встроенные функции inf и nan, доступные в пространстве имён "builtin::" ("builtin::inf" и "builtin::nan"). Данные функции можно использовать в качестве констант, определяющих бесконечность и нечисловое значение.
- Добавлен логический оператор "^^", соответствующий операции XOR и дополняющий битовый оператор "^" (в Perl предоставляет три базовых битовых оператора "&", "|" и "^", соответствующих операциям AND, OR и XOR, но для логических операций до сих пор были доступны только варианты AND ("&&") и OR ("||")). Логическое выражение "$x ^^ $y" вернёт TRUE, когда либо "x", либо "y" имеют значение TRUE, но не одновременно.
- Прекращена поддержка симуляции версий до 5.11. Использование директивы "use номер_версии", отключающей дополнительные возможности, добавленные в интерпретаторе после указанной версии, с номером версии меньше 5.11 (например, "use v5.8") теперь будет приводить к выводу ошибки, а не предупреждения. Аналогично добавлен вывод предупреждения при использовании в "use" версии меньше 5.39 (предупреждения будут заменены на ошибку в выпуске 5.44).
- Разрешено использование пробела между опцией командной строки "-M" и именем модуля, например "perl -M Data::Dumper=Dumper -E 'say Dumper [1,2,3]'" (раньше нужно было писать "perl -MData::Dumper...").
- Объявлено устаревшим использование оператора "goto" для перехода из внешней области видимости во внутреннюю. Поддержка данной возможности будет прекращена в версии Perl 5.42.
- В основной состав включены модули Term::Table и Test2::Suite, предназначенные для создания unit-тестов. Обновлены версии модулей Archive::Tar, Compress::Raw::Bzip2, Compress::Raw::Zlib, Data::Dumper, DB_File, File::Compare, File::Find, Getopt::Long, Hash::Util, HTTP::Tiny, IO, Math::BigInt, PerlIO::encoding, Tie::File, Time::HiRes и т.п.
- Добавлена поддержка операционной системы Serenity OS.
Устранены две уязвимости:
- CVE-2023-47038 - запись за границу буфера при обработке некорректных Unicode-свойств, определённых пользователем. Проблема может привести к переполнению буфера на 1 байт при обработке специально оформленных регулярных выражений.
- CVE-2023-47039 - возможность подмены исполняемого файла на платформе Windows из-за поиска cmd.exe в путях с использованием переменной окружения PATH, в которой текущий рабочий каталог является более приоритетным, чем системный каталог с исполняемым файлом cmd.exe[1].
2023: Perl 5.38.0
3 июля 2023 года стало известно о том, что после 13 месяцев разработки опубликован релиз стабильной ветки языка программирования Perl - 5.38. При подготовке выпуска было изменено около 290 тыс. строк кода, изменения затронули 1500 файлов, в разработке приняли участие 100 разработчиков.
Как сообщалось, ветка 5.38 выпущена в соответствии с утверждённым десять лет назад фиксированным графиком разработки, подразумевающим выпуск стабильных веток раз в год и корректирующих релизов - раз в три месяца. Примерно через месяц планируется выпустить первый корректирующий релиз Perl 5.38.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.38.0. Одновременно с выходом Perl 5.38 прекращена поддержка ветки 5.34, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.39, на базе которой в мае или июне 2024 года будет сформирован стабильный релиз Perl 5.40, если не будет принято решение перейти к нумерации 7.x.
Ключевые изменения:
- Предложен экспериментальный синтаксис создания классов, в которых могут определяться поля и методы, привязанные к каждому экземпляру класса. Классы расширяют возможности работы с объектами в Perl и позволяют использовать более близкий к другим языкам программирования синтаксис (ранее подобие объектной модели в Perl 5 основывалось на применении иерархии, привязанной к именам пакетов).
- Определение классов похоже на создание пакетов при помощи блока "package", за исключением необходимости инициализации класса с запуском конструктора ("my $object = My::Class->new(%arguments);") для создания отдельного экземпляра класса, с которым в последующем ведётся работа. Для выполнения своего кода во время инициализации предложен блок "ADJUST", напоминающий блок "BEGIN". Возможно наследование классов, используя атрибут ":isa".
- Переменные, определяемые внутри класса при помощи ключевого слова "field", видны только внутри класса - для каждого экземпляра класса создаётся отдельное хранилище полей, не пересекающиеся с другими экземплярами того же класса. Методы позволяют определить работающие в контексте класса функции.
use feature 'class';
class Example::Base { field $x;
ADJUST { $x = "Hello, world"; }
method print_message { say $x; }
}
class Example::Subclass :isa(Example::Base) { ... }
Example::Base->new->print_message;
- В предупреждения, выводимые при использовании в коде устаревших возможностей, добавлена привязка к подкатегориями, которые могут отключаться по отдельности. Например, для отключения вывода предупреждения об использовании конструкции goto, но сохранении остальных предупреждений, можно указать "no warnings 'deprecated::goto_construct'".
- Предложен служебный хэш "%{^HOOK}", позволяющий создавать функции-обёртки для ключевых слов. В текущем виде доступны для определения две обёртки - "require__before" и "require__after", позволяющие привязать обработчики, вызываемые на разных стадиях обработки ключевого слова "require".
my $old_hook = ${^HOOK}{require__before}; local ${^HOOK}{require__before} = sub { my $old_hook_ret; $old_hook_ret = $old_hook->($name) if $old_hook; warn "Requiring: $name\n"; ... };
- Добавлена переменная окружения PERL_RAND_SEED, через которую можно выставить свою затравку для генератора псевдослучайных чисел (например, для достижения повторяемого поведения во время тестирования).
- Добавлена поддержка операторов "//=" и "||=" для определения значений по умолчанию аргументов функций. Выставленное через оператор "//=" значение применяется, если аргумент не определён (undef), а оператор "||=" применяется, если аргумент содержит логическое значение "false" или отсутствует).
sub foo ($name //= "world") { print "Hello, $name"; } sub foo ($x ||= 10) { return 5 + $x; } foo(undef); # будет выведено "Hello, world"
- Поддержка спецификации Unicode обновлена до версии 15.0.
- В некоторых случаях внутри блоков "defer" (отложенные блоки, выполняемые в самом конце) и "finally" (блок с кодом, выполняемый в самом конце конструкции try/catch) разрешено использование оператора "goto". Применение goto допускается только при использовании постоянных меток перехода, которые не выходят за пределы блока.
use feature 'defer';
defer { goto LABEL; print "This does not execute\n"; LABEL: print "This does\n"; }
- На стадии компиляции обеспечено выявление недопустимого выхода из блоков defer или finally при помощи операций return или goto. Ранее подобные запрещённые манипуляции выявлялись только в момент выполнения проблемного кода, а теперь ошибка выводится сразу.
- Для выполнения блоков кода внутри regex-шаблона добавлена конструкция "*{ ... }", которая эквивалентна конструкциям "?{ ... }" и "??{ ... }", за исключением того, что её использование не приводит к отключению оптимизации в движке регулярных выражений, из-за чего повышается производительность, но поведение становится менее стабильным.
"good" =~ /g(?:o(*{print "o"}))*d/;
- Размер квантификаторов регулярных выражений (REG_INF) увеличен с 65 536 до 2 147 483 647 (c U16_MAX до I32_MAX), что позволяет использовать конструкции вида "/(?:word){1000000}/".
- Добавлены функции optimize_optree и finalize_optree для работы с фрагментами внутренней структуры optree.
- В движке регулярных выражений реализована переменная ${^LAST_SUCCESSFUL_PATTERN}, при помощи которой можно получить доступ к последнему успешно выполненному шаблону.
if (m/foo/ || m/bar/) { s/${^LAST_SUCCESSFUL_PATTERN}/PQR/; }
- Добавлена поддержка категории локали LC_NAME, которую можно указывать при вызове "setlocale".
- Изменения, нарушающие совместимость: В функции readline() и операторе "<>" после ошибки при обработке потока прекращена очистка флагов, сигнализирующих конец файла или ошибки. Прекращено выполнение блоков INIT после вызова exit() в секции BEGIN.
- Объявлено устаревшим использование символа " ' " в качестве разделителя имён пакетов[2].
2010: Perl 6
Создатель языка Perl Ларри Уолл ежегодно выступает с публичной речью, посвященной прогрессу в области разработки своего детища. В 2010 году выступление прошло в рамках конференции O’Reilly Open Source Convention, и Уолл в своей речи намекнул, что шестая, капитально обновленная версия Perl, разработка которой идет уже около десяти лет, возможно, вскоре наконец будет выпущена.
Как и в предыдущие годы, Уолл продемонстрировал ряд новых возможностей Perl 6.
Например, если задать языку последовательность цифр, он способен угадать следующее число в ряду. Так, команда «(1,3,5,7, ....*)» вернет набор из 20 нечетных чисел, начиная с единицы, а по команде «(1,2,4, ....*)» будет выдана последовательность из степеней двойки.
Уолл порассуждал на тему о том, станет ли Perl 6 «прорывной технологией». По его мнению, этот термин сейчас настолько часто используется, что практически потерял смысл, но все же он заслуживает существования. Как полагает Уолл, «прорывную технологию» можно определить как превосходящую по значимости существующие, даже если она в чем-то уступает предшественнице.
Уолл убежден, что ранние версии Perl стали прорывными для сообщества Unix, поскольку не следовали изначальной идеологии этой операционной системы «делать что-то одно, но делать хорошо». Разработчики Perl с гордостью подчеркивают, что в Perl любую задачу можно решить несколькими способами.
Недостаток подхода Unix, по мнению Уолла, состоит в том, что в реальности лишь немногие из утилит этой операционной системы идеально выполняли свои функции.
«Они все были полны искусственных ограничений, — полагает Уолл. — Системным администраторам приходилось тратить массу усилий, чтобы согласовать между двумя утилитами формат данных для какой-либо операции, и каждая такая операция неизбежно приводила к созданию массы маленьких файлов, разбросанных по каталогу. Perl же способен работать в обход оболочки Unix, оставляя данные в самой программе».
По данным исследования, представленного аналитической компанией W3Techs в конце 2011 года, использование языка программирования Perl на веб-серверах упало ниже уровня 1%. Когда-то самый популярный скриптовый язык Perl занимает всего лишь пятое место по популярности с долей в 0,997%.
По мнению экспертов W3Techs, эта доля соответствует использованию Perl на сайтах, число которых измеряется миллионами, что `совсем не плохо` с учетом того, что веб-серверы, построенные на основе Ruby и Python, занимают менее 1% в Сети.
Эксперты W3Techs также отмечают небольшую, но весьма значимую, по их мнению, тенденцию: за последнее время 4,1% сайтов с Perl переведены на PHP, но в то же время 2,7% всех сайтов с поддержкой Perl использовали до недавнего времени язык PHP.
Языки программирования