Ветка 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: $namen"; ... };
- Добавлена новая переменная окружения 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 executen"; LABEL: print "This doesn"; }
- На стадии компиляции обеспечено выявление недопустимого выхода из блоков 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.
- Объявлено устаревшим использование символа «‘» в качестве разделителя имён пакетов.
Источник: http://www.opennet.ru/opennews/art.shtml?num=59373