После года разработки опубликован релиз новой стабильной ветки языка программирования Perl – 5.42. При подготовке нового выпуска было изменено около 280 тысяч строк кода (без документации и автоматически сгенерированного кода – 93 тысячи), изменения затронули 1500 файлов, в разработке приняли участие 64 разработчика.
Ветка 5.42 выпущена в соответствии с утверждённым двенадцать лет назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов – раз в три месяца. Примерно через месяц планируется выпустить первый корректирующий релиз Perl 5.42.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.42.0. Одновременно с выходом Perl 5.42 прекращена поддержка ветки 5.38, для которой обновления могут быть выпущены в будущем только в случае выявления критических проблем с безопасностью. В ближайшее время начнётся процесс разработки экспериментальной ветки 5.43, на базе которой в июне 2026 года будет сформирован стабильный релиз Perl 5.44, если не будет принято решение перейти к нумерации 7.x.
Ключевые изменения:
- Добавлены экспериментальные операторы обработки списков – “any { BLOCK } @list” и “all { BLOCK } @list”, которые напоминают оператор grep, но могут возвращать только значения true или false. Оператор “all” возвращает “true” при выполнении условия для всех элементов списка, а оператор “any” – при выполнении условия хотя бы для одного элемента. Функциональность операторов аналогична функциям из модуля List::Util, но встроенные варианты быстрее и потребляют меньше памяти. use v5.42; use feature ‘keyword_all’; no warnings ‘experimental::keyword_all’; my @numbers = … if ( all { $_ % 2 == 0 } @numbers ) { say “All the numbers are even”; }
- Для определяемых внутри класса полей реализован атрибут “:writer”, применяемый для автоматического создания метода, записывающего значение переменной в поле для текущего экземпляра класса. class Point { field $x :reader :writer :param; field $y :reader :writer :param; } my $p = Point->new( x => 20, y => 40 ); $p->set_x(60);
- Добавлена поддержка определения лексических методов, которая по аналогии с определением лексических подпрограмм (“lexical_subs”), позволяет создавать методы, доступные только в области лексической видимости блока в котором они были созданы. Для создания подобных методов используется выражение “my имя_метода”.
- Добавлен оператор “->&”, позволяющий вызывать подпрограммы, находящиеся в лексической области видимости, так, как будто они являются методами. В сочетании с возможностью определения лексических методов новый оператор реализует функциональность, похожую на приватные методы.
- Добавлен оператор присвоения “A ^^= B”, выполняющий операцию
“A = A XOR B”. - Добавлена прагма “source::encoding“, определяющая кодировку исходного кода. Для кода в кодировке ASCII можно указать “use source::encoding ‘ascii'” (по умолчанию), а для UTF-8 – “use source::encoding ‘utf8′”, при этом последнее выражение эквивалентно выражению “use utf8”. Интерпретатор выведет ошибку, если в коде, помеченном как ASCII, встречаются символы UTF-8, или если в коде, помеченном как UTF-8, используются escape-последовательности “x{}”. Для отключения проверки для области кода можно использовать значение “use no source::encoding”. На практике, добавленная прагма может быть полезной для выявления случаев, когда разработчик забыл указать “use utf8” для кода в кодировке UTF-8.
- Функция chdir() добавлена в пространство имён “CORE::” (например, теперь к данной функции можно обращаться как “&CORE::chdir($dir)” или “my $ref = &CORE::chdir; $ref->($dir)”).
- Добавлено выражение ‘no feature “apostrophe_as_package_separator”‘ для отключения поддержки использования символа ” ‘ ” в качестве разделителя имён пакетов (например, “My’Module’Var” вместо “My::Module::Var”). Изначально планировалось удалить в Perl 5.42 поддержку подобных разделителей, которые ранее были объявлены устаревшими, но в ходе обсуждений было решено сохранить данную возможность по умолчанию, но предусмотреть опцию для отключения.
- В число возвращаемых возможностей переведена функциональность “switch” и оператор “~~”, которые ранее были помечены устаревшими и были запланированы к удалению. Начиная с выпуска Perl 5.36 и 5.42 возможности “switch” и “~~” по умолчанию отключены при привязке кода к версиям языка (например, при указании “use v5.42”), но могут быть активированы выражениями ‘use feature “switch”‘ и ‘use feature “smartmatch”‘.
- Добавлена поддержка спецификации Unicode 16.0.