Произведен выпуск Perl 5.18

Объявлено в выходе новой ветки языка программирования Perl – Perl 5.18. Ветка 5.14 далее поддерживаться и обновляться не будет, за исключением случаев выявления критических проблем, связанных с безопасностью.

Выпуск подготавливался в течение последнего года. Работа велась четко по графику, утвержденному еще три года назад, согласно которому раз в год производились выпуски новых стабильных веток, а раз в три месяца выпускались корректирующие релизы. Очередной корректирующий релиз (Perl 5.18.1), в котором будут учтены и исправлены ошибки, обнаруженные при внедрении Perl 5.18.0, запланирован на 20 июня.

Над новой веткой работали 113 специалистов. Изменено порядка 400 тысяч кодовых строк и 2100 файлов.

Среди основных улучшений можно отметить следующее:

  1. Новое решение реализации хэшей. В хэш-функциях обеспечена рандомизация, что значительно повышает уровень безопасности. Переменная PERL_PERTURB_KEYS позволит настроить уровень рандомизации. При присвоении нулевого значения последняя будет отключена, и работа Perl в этом отношении не будет отличаться от предыдущих выпусков. Дело в том, что теперь элементы функций value(), keys() и each () будут выводиться в случайном порядке. Если в используемых приложениях применяется недокументированное свойство сохранения порядка записей в различных хэшах, то данное обновление может повлиять на работу таких приложений. При запусках скрипта одинаковые записи будут следовать по-разному как в разных, так и в одних и тех же хэшах. Кроме того, реализовано применение альтернативных хэш-функций. Помимо установленного по умолчанию алгоритма хэширования ONE_AT_A_TIME_HARD, задействованы несколько альтернативных вариантов. Однако в качестве безопасного указывается только SIPHASH. В обеспечении безопасности остальных имеется ряд проблем, поэтому применять эти алгоритмы рекомендуется только для экспериментов.
  2. В экспериментальном порядке обеспечена поддержка «lexical subs» (лексические подпрограммы). Используя эту возможность, можно определить подпрограммы, отображаемые лишь в области лексической видимости блока, в котором они созданы. Для этого используется выражение «state sub». Отличие от «my sub» состоит в более высокой скорости работы, так как не требуется создания «state sub» при каждом входе в блок. К тому же, эти процедуры могут совместно использоваться в вызовах других программ.
  3. Пространство «CORE» теперь включает функции exists, defined, undef, split, delete, glob, pos, scalar, prototype, study. Если раньше работа с ними требовала применения хитрых манипуляций, то теперь она ведется в обычном порядке.
  4. В качестве опять же эксперимента, в системе регулярных выражений поддерживается расширение, допускающее использование большего количества методов работы с множествами (пересечение, объединение, исключение). При этом можно задавать не только простые правила, вроде образования ряда символов, в котором отсутствуют определенные символы, но и формировать более сложные множества. Новая возможность сходна по функциональности с модулем Unicode::Regex::Set.
  5. По-новому поставлена работа с экспериментальными возможностями. Появилась категория «experimental» – предупреждения, используемые для уведомлений при проведении тестов функций. Для открытия доступа к экспериментальным возможностям и отключения соответствующих предупреждений указываются директивы: no warnings "experimental::feature_name"; use feature "feature_name";
  6. Изменения коснулись операторов redo, last и next. Если раньше нельзя было отойти от постоянных значений аргументов, то теперь операторы содержат метки, вычисляемые динамически. Они формируются на основе произвольных выражений при выполнении скриптов.
  7. Включена поддержка Unicode 6.2. Для имен символов теперь допустимы не только латинские буквы, но и другие знаки диапазона Unicode. Кроме того, реализована функция задания символам собственных имен в \N{...}, charnames::vianame() (и не только). Если же для символа использовано неизвестное имя, то будет выводиться не предупреждение, как раньше, а ошибка. При использовании функции readline (), в условии $/ = \N, N воспринимается как N-символов, а не байт. Благодаря проведенной оптимизации, работа с регулярными выражениями, содержащими символы Unicode, теперь ведется быстрее. В частности, выполнение \X происходит быстрее на 35-40%.
  8. Новая служебная переменная (${^LAST_FH}) позволяет вернуться к последнему прочитанному дескриптору файлов.
  9. Обновлено большое количество базовых модулей. Модули Module::Pluggable*, Log::Message*, Object::Accessor, Term::UI*, Archive::Extract, Devel::InnerPackage, B::Lint*, Pod::LaTeX, encoding считаются устаревшими. Функции проверки класса символов, которые вызываются из системной библиотеки напрямую (такие, как например, is_uni_alnum), больше не поддерживаются.
  10. Прекращена поддержка следующих платформ: z/OS, NeXT, DG/UX, Windows CE.
  11. Включены дополнительные контрольные точки для работы с системой динамической отладки DTrace (loading-file, op-entry, loaded-file).
  12. Табуляция (\cK) включена в множество (\s) – множество символов пробела.
  13. Появился новый пункт в документации к модулю Storable, согласно которому не следует десериализировать данные, полученные извне, если нет полного доверия к их источникам. Дело в том, что в процессе выполнения этой операции возможно выполнение perl-кода, а также загрузка модулей.

Помимо этого, началась экспериментальная разработка ветки Perl 5.19, стабильный релиз которой (Perl 5.20) запланирован на май следующего года.