После года разработки представлена новая стабильная ветка языка программирования 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; 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;
- Активирован новый copy-on-write механизм копирования строк, при котором непосредственное копирование в новый буфер производится при попытке изменить строку, но не при назначении переменных, что заметно увеличивает эффективность работы со строками и избавляет от необходимости передачи строки в форме указателя. Добавлены дополнительные оптимизации в код сопоставления масок в движке регулярных выражений и реализацию массивов и хэшей;
- В поставку добавлен новый модуль IO::Socket::IP, предоставляющий универсальную поддержку сокетов, работа с которыми не отличается для IPv4 и IPv6.