После 11 месяцев разработки опубликован релиз новой стабильной ветки языка программирования Perl – 5.40. При подготовке нового выпуска было изменено около 160 тыс. строк кода (без документации и автоматически сгенерированного кода – 110 тысяч), изменения затронули 1500 файлов, в разработке приняли участие 75 разработчиков.
Ветка 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.