Доступен язык программирования Perl 5.40.0

После 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.

Источник: http://www.opennet.ru/opennews/art.shtml?num=61343