Доступен язык программирования 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 < 100 or die "Too big";
           send_output($x);
       }
       catch ($e) {
           warn "Unable to output a value; $e";
       }
       print "Finished\n";
    
  • Стабилизирован синтаксис «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

OpenNet прочитано 4319 раз