Perl 5.40.0: что нового спустя 11 месяцев? Изменения и дополнения в релизе
Не прошло и года, как разработчики дождались новой стабильной ветки языка программирования Perl — 5.40. При подготовке этого выпуска изменениям подверглись свыше 160 тыс. строк кода и 1 500 файлов. Всего в работе над релизом приняли участие 75 специалистов. Ну, а подробности, как всегда, под катом.
Что там с релизом?
Все новинки выпускаются в полном соответствии с утвержденным 11 лет назад фиксированным графиком разработки. Согласно ему каждый год выпускаются стабильные ветки, а раз в три месяца — корректирующие релизы. Сейчас заявлено о том, что через месяц выйдет первый корректирующий релиз Perl 5.40.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.40.0.
Стоит отметить, что разработчики прекратили поддержку ветки 5.36. Теперь обновления для нее будут выпускаться лишь в случае обнаружения критических проблем с безопасностью. Через несколько дней команда приступит к работе над веткой 5.41, на базе которой в мае или июне 2025 года будет сформирован стабильный релиз Perl 5.42. Кстати, вполне может случиться, что разработчики примут решение изменить нумерацию релизов на 7.х.
Что нового?
Важнейшее изменение — расширение возможностей, которые имеют отношение к экспериментальному синтаксису для создания классов. Так, в этом релизе появилось новое слово »__CLASS__», которое при вызове из методов, блоков ADJUST или при инициализации полей возвращает имя текущего класса по аналогии с тем, как ключевое слово __PACKAGE__ возвращает имя пакета. Его можно применять для инициализации полей доступа к методам класса на этапе, предшествующем завершению создания экземпляра класса. Ну, а для базового класса значение __CLASS__ идентично значению __PACKAGE__, но будет отличаться при создании подклассов.
use feature 'class';
class Example1 {
field $f = __CLASS__->default_f;
sub default_f { 10 }
}
Внутри класса полей появился атрибут : reader, который применяется в случае автоматического создания метода. Он возвращает значение переменной из поля в текущем экземпляре класса. Так, теперь указание атрибута после определения поля означает создание метода «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)». Он используется для перебора списков с единовременным извлечением сразу нескольких значений в одной итерации цикла.
Стабильным объявили и модуль 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 номер_версии», отключающей дополнительные возможности, добавленные в интерпретаторе после указанной версии, в новой версии будет приводить к выводу ошибки.
Разрешено использование пробела между опцией командной строки »-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.