После года разработки опубликован релиз новой стабильной ветки языка программирования Perl – 5.36. При подготовке нового выпуска было изменено около 250 тыс. строк кода, изменения затронули 2000 файлов, в разработке приняли участие 82 разработчика.
Ветка 5.36 выпущена в соответствии с утверждённым девять лет назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов – раз в три месяца. Примерно через месяц планируется выпустить первый корректирующий релиз Perl 5.36.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.36.0. Одновременно с выходом Perl 5.36 прекращена поддержка ветки 5.32, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.37, на базе которой в мае или июне 2023 года будет сформирован стабильный релиз Perl 5.38, если не будет принято решение перейти к нумерации 7.x.
Ключевые изменения:
- Стабилизирована и теперь доступна при указании прагмы “use v5.36”
поддержка сигнатур функций, позволяющих явно определить перечень переменных, используемых в функции и автоматизировать операции проверки и присвоения значений из массива входящих параметров. Например, ранее используемый код: sub foo { die “Too many arguments for subroutine” unless @_ >= 2; die “Too few arguments for subroutine” unless @_при использовании сигнатур может быть заменён на:
sub foo ($left, $right) { return $left + $right; }
При вызове foo с числом аргументов, отличным от двух, интерпретатор выведет ошибку. В списке также поддерживается специальная переменная “$”, которая позволяет игнорировать часть аргументов, например, “sub foo ($left, $, $right)” позволит выполнить копирование в переменные только первого и третьего аргумента, при этом в функцию необходимо передать ровно три аргумента.
Синтаксис сигнатур также позволяет указывать необязательные аргументы и задавать значения, используемые по умолчанию в случае отсутствия аргумента. Например, указав “sub foo ($left, $right = 0)” второй аргумент становится необязательным и при его отсутствии передаётся значение 0. В операции присваивания можно указать произвольное выражения, в том числе с использованием других переменных из списка или глобальных переменных. Указание вместо переменной хэша или массива (например, “sub foo ($left, @right)”) приведёт к возможности передачи одного и более аргументов.
- В функциях, объявленных с использованием сигнатур, поддержка дополнительного присвоения параметров из массива “@_” объявлена экспериментальной и будет приводить к выводу предупреждения (предупреждение выводится только если @_ используется в функциях, объявленных при помощи нового синтаксиса). Например, предупреждение будет выведено для функции: use v5.36; sub f ($x, $y = 123) { say “The first argument is $_[0]”; }
- Стабилизирован и доступен при указании прагмы “use v5.36” инфиксный оператор “isa” для проверки того, является ли объект экземпляром указанного класса или классом, производным от него. Например: if( $obj isa Package::Name ) { … }
- При указании прагмы “use v5.36” включена обработка предупреждений (активирован режим “use warnings“).
- При указании прагмы “use v5.36” отключена поддержка косвенной нотации вызова объектов (“feature indirect”) – устаревшего способа вызова объектов, при котором вместо “->” используется пробел (“method $object @param” вместо “$object->$method(@param)”). Например, вместо “my $cgi = new CGI” нужно использовать “my $cgi = CGI->new”.
- При указании прагмы “use v5.36” отключена поддержка эмуляции многомерных массивов и хэшей в стиле Perl 4 (“feature multidimensional“), позволяющих транслировать указание нескольких ключей в промежуточный массив (например, “$hash{1, 2}”) преобразовывалось в “$hash{join($;, 1, 2)}”).
- При указании прагмы “use v5.36” отключена поддержка экспериментального механизма ветвления (“feature switch“), аналогичного операторам switch и case (в Perl применяются ключевые слова given и when).
Для использования данной возможности начиная с Perl 5.36 нужно явно указывать ‘use feature “switch”‘, а при указании “use версия” она больше автоматически включаться не будет. - Стабилизирована и доступна по умолчанию поддержка дополнительных классов символов в квадратных скобках внутри регулярных выражений. Возможность позволяет осуществлять сопоставления с использованием расширенных правил пересечения, исключения и объединения множеств символов. Например, ‘[A-Z – W]’ – символы от A до Z за исключением W.
- Частично стабилизирована и доступна по умолчанию поддержка операций “(?lookbehind). Для выражений со скобками, таких как ‘”aaz”=~/(?=z)(?
- Добавлен экспериментальный синтаксис для перебора списков с единовременным извлечением сразу нескольких значений в одной итерации цикла – “for my (VAR, VAR) (LIST)” и “foreach my (VAR, VAR) (LIST)”. Например, теперь можно указывать: foreach my ($key, $value) (%hash) { … } for my ($left, $right, $gripping) (@moties) { … }
- Обеспечено сохранение состояния булевых значений “true” и “false” при их присвоении переменным. Для проверки является ли переменная булевой предложена встроенная функция is_bool().
- Добавлена экспериментальная поддержка функций, встроенных в интерпретатор и всегда доступных. Предложенный набор встроенных функций документирован в модуле builtin. По умолчанию встроенные функции должны вызываться с использованием префикса “builtin::” (например, “builtin::reftype([])”), а для использования коротких имён (“reftype([])”) следует использовать прагму “use” (например, “use builtin ‘reftype'”).
Среди добавленных в Perl 5.36 встроенных функций: builtin::trim (чистка граничных пробелов), builtin::indexed (нумерация элементов списка), builtin::true, builtin::false, builtin::is_bool, builtin::weaken, builtin::unweaken, builtin::is_weak
, builtin::blessed, builtin::refaddr, builtin::reftype, builtin::ceil и builtin::floor. - Добавлена экспериментальная поддержка блоков отложенного выполнения, определяемых пои помощи нового ключевого слова defer. Указанные блоки выполняются в самом конце выполнения. Если блок defer встретился во время выполнения, он пропускается и вызывается только на стадии выхода. Например: use feature ‘defer’; { say “Первый”; defer { say “Последний”; } say “Второй”; }
- Для обработчиков исключений, определяемых при помощи ключевых слов try и catch, предложена экспериментальная поддержка третьего ключевого слова “finally”, позволяющего определить блок с кодом, выполняемым в самом конце конструкции try/catch, даже если обработчик будет прерван исключением или оператором перехода (по аналогии с “defer”). try { attempt(); print “Successn”; } catch ($e) { print “Failuren”; } finally { print “This happens regardlessn”; }
- В операторах экранирования текста, таких как “qr”, предоставлена экспериментальная возможность использования не-ASCII символов в качестве парных разделителей (feature extra_paired_delimiters). Например, вместо “”, “( )”, “{ }” и “[ ]” можно использовать символы “« »”, “” “” и т.п. Например, “qr«pat»”.
- Запрещён вызов функции sort без аргументов, который теперь будет приводить к выводу ошибки. @a = sort @empty; # продолжит работу @a = sort; # будет выведена ошибка @a = sort (); # будет выведена ошибка
- Предложен новый флаг командной строки “-g“, включающем режим загрузки всего файла целиком, а не построчно. Действие флага
аналогично указанию “-0777”. - Поддержка спецификации Unicode обновлена до версии 14.0.
- Обеспечено мгновенная обработка исключений, связанных с вычислениями с плавающей запятой (SIGFPE), аналогичная обработке других аварийных сигналов, таких как SIGSEGV, что позволяет привязывать собственные обработчики для сигнала SIGFPE через $SIG{FPE}, например, выводящий номер строки в которой возникла проблема.
- Обновлены версии модулей, входящих в базовую поставку.
- Добавлены оптимизации производительности. Например, предоставлена возможность более эффективного хранения ключей больших хэшей, без использования разделяемых таблиц строк. Значительно повышена производительность создания новых скалярных значений, например, следующий код теперь выполняется на 30% быстрее: $str = “A” x 64; for (0..1_000_000) { @svs = split //, $str }
- В коде началось использование некоторых конструкций, определённых в стандарте C99. Для сборки Perl теперь требуется компилятор, поддерживающий C99. Прекращена поддержка сборки в старых версиях MSVC++ (до VC12). Добавлена поддержка сборки в Microsoft Visual Studio 2022 (MSVC++ 14.3).
- Прекращена поддержка платформ AT&T UWIN, DOS/DJGPP и Novell NetWare.