Ветка 5.40 выпущена в соответствии с утверждённым одиннадцать лет назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов — раз в три месяца. Примерно через месяц планируется выпустить первый корректирующий релиз 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__, но будет отличаться при создании подклассов.
use feature 'class'; class Example1 { field $f = __CLASS__->default_f; sub default_f { 10 } }
- Для определяемых внутри класса полей реализован атрибут «: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.
try { my $x = call_a_function(); $x
- Стабилизирован синтаксис «for my (VAR, VAR) (LIST)» и «foreach my (VAR, VAR) (LIST)», применяемый для перебора списков с единовременным извлечением сразу нескольких значений в одной итерации цикла. Например, теперь можно указывать:
foreach my ($key, $value) (%hash) { ... } for my ($left, $right, $gripping) (@moties) { ... }
- Объявлен стабильным модуль builtin, включающий всегда доступные функции, встроенные в интерпретатор. В настоящее время в модуле предложены функции 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.
Источник: http://www.opennet.ru/opennews/art.shtml?num=61343