Доступен язык программирования Perl 5.36.0

После года разработки опубликован релиз новой стабильной ветки языка программирования 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 @_ <= 2;
            my($left, $right) = @_;
            return $left + $right;
        }
    

    при использовании сигнатур может быть заменён на:

    
        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)(?<=(a|aa))/', пока оставлен экспериментальный статус, так как разработчики не уверены в сохранении нынешнего поведения ($1 ссылается на "aa", а не "a").


  • Добавлен экспериментальный синтаксис для перебора списков с единовременным извлечением сразу нескольких значений в одной итерации цикла - "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 "Success\n";
       }
       catch ($e) {
           print "Failure\n";
       }
       finally {
           print "This happens regardless\n";
       }
    
  • В операторах экранирования текста, таких как "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.

OpenNET

Связь с редакцией