Не прошло и года, как разработчики дождались новой стабильной ветки языка программирования 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.