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