После года разработки представлена новая стабильная ветка языка программирования Perl - 5.20. При подготовке нового выпуска было изменено около 470 тыс. строк кода, изменения затронули 2900 файлов, в разработке приняли участие 124 разработчика.

Ветка 5.20 выпущена в соответствии с утверждённым четыре года назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов - раз в три месяца. Примерно через месяц планируется выпустить первый корректирующий релиз Perl 5.20.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.20.0. Одновременно с выходом Perl 5.20 прекращена поддержка ветки 5.16, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.21, на базе которой в мае 2015 года будет сформирован стабильный релиз Perl 5.22.

 

Ключевые улучшения, добавленные в Perl 5.20:

  • Экспериментальная поддержка сигнатур функций, позволяющих явно определить перечень переменных, используемых в функции и автоматизировать операции проверки и присвоения значений из массива входящих параметров. Для активации поддержки сигнатур функций необходимо указать директиву "use feature 'signatures'"; Например, ранее используемый код:
        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 = 0)" второй аргумент становится необязательным и при его отсутствии передаётся значение 0. В операции присваивания можно указать произвольное выражения, в том числе с использованием других переменных из списка или глобальных переменных. Указание вместо переменной хэша или массива (например, "sub foo ($left, @right)") приведёт к возможности передачи одного и более аргументов.

    В списке также поддерживается специальная переменная "$", которая позволяет игнорировать часть аргументов, например, "sub foo ($left, $, $right)" позволит выполнить копирование в переменные только первого и третьего аргумента, при этом в функцию необходимо передать ровно три аргумента. Возможность обращения к параметрам через массив "@_" сохраняется, поэтому второй аргумент можно получить как значение "$_[1]";

  • Для определения прототипов функций, предоставляющих средства для проверки аргументов на этапе компиляции, а не в процессе выполнения, обеспечена поддержка атрибута ":prototype", например, теперь можно указать "sub foo :prototype($$);" вместо "sub foo ($$);". "$$" подразумевает вызов с двумя аргументами. Для определения типа аргумента могут использоваться такие символы, как "$" (переменная), "@" (массив), "+" (ссылка на массив или хэш), "*" (файловый десктиптор). Для отделения обязательных аргументов от опциональных используется знак ";". Для прототипов функций допускается указание сигнатур, например, "sub foo :prototype($$) ($left, $right)";
  • Функция rand() переведена на использование для всех платформ более качественного последовательного генератора псевдослучайных чисел drand48(). Ранее 48-битовый генератор псевдослучайных чисел использовался только для POSIX-систем, таких как Linux, а в Windows применялась менее безопасная 15-битная реализация;
  • Новый синтаксис для операции выделения части хэшей и массивов (slice) - %hash{...} и %array[...], при использовании которого (например, "%subset = %hash{'foo', 'bar'};" или "@list = %a[3,4,6];") возвращается список из пар ключ/значение или индекс/значение;
  • Добавлена экспериментальная операция постфиксного разыменования (postderef). Например, операция "$sref->$*" эквивалентна "${ $sref }", "$aref->@*" аналогична "@{ $aref }", а "$href->%{ ... }" можно использовать вместо "%$href{ ... }". Для активации поддержки необходимо указать директиву "use feature 'postderef_qq'";
  • Поддержка Unicode 6.3. Для регулярных выражений добавлена поддержка маски "\p{Unicode}", которая является синонимом "\p{Any}" и срабатывает для кодов символов в диапазоне 0 - 0x10FFFF.
  • Директива "use locale" теперь может применяться с локалями UTF-8 (ранее с "use locale" поддерживались только однобайтные локали), а также на системах без локали. Обеспечена возможность отката на локаль "C" в случае возникновения проблем с инициализацией выбранной локали. Добавлена опция "-DL" для отслеживания настроек локали в процессе запуска интерпретатора;
  • Специальные переменные $a и $b включены в список исключений при выводе предупреждений, что позволяет создавать функции, оперирующие переменными $a и $b, по аналогии с функцией sort;
  • Улучшена работа на 64-разрядных платформах. Внутренние функции работы с массивами переведены на использование 64-разрядных смещений, что позволяет создавать массивы, содержащие более 2^31 элементов. Движок регулярных выражений теперь может работать со строками длиннее 2^31 символов. Функции PerlIO_get_bufsiz, PerlIO_get_cnt, PerlIO_set_cnt и PerlIO_set_ptrcnt переведены с типа int на тип SSize_t;
  • Объявлены устаревшими и скоро будут исключены из базовой поставки модули CGI и Module::Build, а также связанные с ним модули иерархии CGI::* и Module::Build::*. Данные модули нужно будет устанавливать из архива CPAN. В будущем также ожидается удаление утилит find2perl, s2p и a2p;
  • Многопоточность средствами интерпретатора ("use threads") переведена в разряд не рекомендованных возможностей из-за усложнённой, недостаточно быстрой и легко приводящей к ошибкам реализации. Удаление текущей реализации пока не планируется, но при появлении более оптимальных альтернатив она будет переведена в разряд устаревших;
  • Активирован новый copy-on-write механизм копирования строк, при котором непосредственное копирование в новый буфер производится при попытке изменить строку, но не при назначении переменных, что заметно увеличивает эффективность работы со строками и избавляет от необходимости передачи строки в форме указателя. Добавлены дополнительные оптимизации в код сопоставления масок в движке регулярных выражений и реализацию массивов и хэшей;
  • В поставку добавлен новый модуль IO::Socket::IP, предоставляющий универсальную поддержку сокетов, работа с которыми не отличается для IPv4 и IPv6.