03.02.2023

Perl 5.36.0

С момента выхода Perl 5.34.0 прошло около года.

Если исключить документацию, автоматически генерируемые файлы и инструментарий для формирования самого релиза, в новой версии изменено 190000 строк в 1300 файлах .pm, .t, .c и .h.

Видение дальнейшего развития языка наконец устоялось. В результате двухгодичных дискуссий, сотрясавших сообщество с момента анонса Perl 7, было решено:

  • Существующий код должен работать и в будущих версиях языка. По крайней мере написанный разумно код. Исключением может быть устранение уязвимостей, влекущее нарушение обратной совместимости.
  • Язык должен развиваться, а скорость добавления новых возможностей должна возрасти. Следствием этого решения является введение процедуры RFC, которая может использоваться для предложения изменений в языке любым желающим.
  • Использование новых функций должно упроститься и разработчики будут всячески способствовать тому, чтобы пользователи активней использовали нововведения.

Подробней о том «Что стало с Perl 7?» можно прочитать здесь.

use v5.36

use v5.36 по умолчанию активирует прагму warnings и как обычно включает новые функции интерпретатора. В их числе:

Прагма signatures

Впервые появилась в версии 5.20.0, несколько раз изменялась и наконец перестала быть экспериментальной.

use v5.36; sub add ($x, $y) { return $x + $y;
}

Тем не менее, некоторые элементы сигнатур не были стабилизированы. Например, использование массива @_ внутри функции с сигнатурами.

Оператор isa

Был представлен в версии 5.32.0, с тех пор не изменялся и теперь считается стабильным.

Оператор возвращает истину когда левый операнд является экземпляром класса указанного в правом операнде:

if( $obj isa Some::Class ) { ... } if( $obj isa "Different::Class" ) { ... }
if( $obj isa $name_of_class ) { ... }

use v5.36 так же отключает ряд возможностей признанных нежелательными:

  • indirect — синтаксис непрямого вызова методов: new Foo 1, 2; # Foo->new(1,2);;
  • multidimensional — эмуляция многомерных массивов через хэши. Осуществляется через неявную конвертацию кода вида $foo{$x, $y} в $foo{ join($;, $x, $y)};
  • Структура switch находившаяся в экспериментальном состоянии с версии 5.10.

Новый флаг интерпретатора -g

Инициализирует переменную содержащую разделитель входящих строк ($/) неопределённым значением, что заставляет Perl считывать файлы не построчно, а целиком. Мнемоники для ключа: gobble, grab, gulp.

Поддержка Юникод 14.0

О нововведениях данной версии стандарта кодирования можно прочитать здесь.

Расширенные классы символов

Метапоследовательность позволяет писать более читаемый код и сокращает вероятность неправильного определения классов. Внутри неё могут использоваться операции над множествами. Метапоследовательность была добавлена в версии 5.18.0 и больше не является экспериментальной.

# Найдёт тайские или лаосские цифры
/(?[ ( \p{Thai} + \p{Lao} ) & \p{Digit} ])/
# Обратите внимание на пробелы!
# Внутри конструкции неявно активирован флаг /xx
#
# Операции над множествами:
#
# & пересечение
# + объединение
# | тоже объединение
# - вычитание
# ^ разность

В документации доступно больше примеров.

Обратный поиск произвольной длины

До 5.36.0 любые виды обратного поиска считались экспериментальными. В данной версии стабилизировано всё кроме поиска с захватом подстроки.
Например:

"aaz"=~/(?=z)(?<=(a|aa))/

Разработчики ещё не решили окончательно что должно попадать в переменную $1 после отрабатывания кода ( «a» или «aa»). На данный момент выбирается самая длинная из возможных альтернатив, но не факт что это поведение сохранится в будущем.

Исправлена ошибка SIGFPE

Подробней можно прочитать здесь.

Отслеживание булевых значений

Булевы значения, обычно создаваемые с помощью !!0 и !!1, или возвращаемые разными встроенными функциями и операторами, теперь сохраняют свою булеву сущность даже после присваивания переменным. Новая экспериментальная функция is_bool() модуля builtin позволяет проверить является ли значение булевым.

Работа с несколькими значениями в цикле (экспериментально)

no warnings "experimental::for_list";
for my ($key, $value) (%hash) { ... }
for my ($left, $right, $gripping) (@moties) { ... }

Функция builtin::indexed может быть полезна для работы с циклами такого вида.

Экспериментальный модуль builtin

Функции из данного модуля доступны всегда.

say "Reference type of arrays is ", builtin::reftype([]);

Лексический импорт тоже возможен:

use builtin 'reftype';
say "Reference type of arrays is ", reftype([]);

Список функций модуля на текущий момент:

  • true;
  • false;
  • is_bool;
  • weaken;
  • unweaken;
  • is_weak;
  • blessed;
  • refaddr;
  • reftype;
  • ceil;
  • floor.

Подробная информация доступна в документации.

Экспериментальный блок defer

Позволяет объявлять сегменты кода, которые будут запускаться в момент выхода из текущей области видимости. Подробней можно прочитать в perldoc perlsyn:

use feature 'defer'; { say "This happens first"; defer { say "This happens last"; } say "And this happens inbetween";
}

Экспериментальный блок finally для конструкций try/catch

try { attempt(); print "Success\n";
}
catch ($e) { print "Failure\n";
}
finally { print "This happens regardless\n";
}

Поддержка не ASCII разделителей операторов-кавычек

Речь про qw, q, s// и т.п (подробнее в perldoc perlop). Список возможных разделителей доступен здесь.

Пустой sort теперь недопустим

@a = sort @empty; # всё хорошо
@a = sort; # ошибка компиляции
@a = sort (); # также ошибка компиляции

Некоторые использовали sort без параметра как странный способ создать пустой список.

Использование use VERSION со значениями меньше v5.11 признано нежелательным

При использовании версии до v5.11 будет выводиться предупреждение:

Downgrading a use VERSION declaration to below v5.11 is deprecated

Причиной данного нововведения является желание изменить поведение прагмы use VERSION. В версии 5.12 строгий режим включался только если он не был ранее явно выключен:

no strict;
use v5.12; # "strict" не включится
$x = 1; # всё хорошо

В будущем любое использование use VERSION со значением v5.12 и больше будет включать строгий режим.

Выпуск также включает улучшения производительности, документации и диагностических сообщений. С развёрнутым списком изменений можно ознакомиться в традиционной perldelta. Ссылка под новостью.

>>> Подробности

Источник.