После года разработки состоялся (http://www.nntp.perl.org/group/perl.perl5.porters/2017/05/ms...) релиз новой стабильной ветки языка программирования Perl - 5.26 (https://metacpan.org/release/perl). При подготовке нового выпуска было изменено около 360 тыс. строк кода, изменения затронули 2600 файлов, в разработке приняли участие 86 разработчиков.Ветка 5.26 выпущена в соответствии с утверждённым пять лет назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов - раз в три месяца. Примерно через месяц планируется выпустить первый корректирующий релиз Perl 5.26.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.24.0. Одновременно с выходом Perl 5.26 прекращена поддержка ветки 5.22, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.27, на базе которой в апреле или мае 2018 года будет сформирован стабильный релиз Perl 5.28.
Новый выпуск включает в себя три существенных изменения, на которые следует обратить внимание в первую очередь:
- Из соображении безопасности текущая директория "." по умолчанию больше не дополняется в виде последнего элемента в @INC. Такое поведение в отношении @INC теперь аналогично тому как если бы ранее был активирован режим "Taint" (ключ запуска "-T"). Данная схема может создать проблемы при сборке, тестировании, установке модулей и исполнении скриптов. Существует несколько простых способов вернуть прежнее поведение perl:
- Схема отключения реализована через включение по умолчанию опции "-Udefault_inc_excludes_dot" для Configure. Поэтому если можно аннулировать значение "-Udefault_inc_excludes_dot" для Configure и пересобрать perl;
- Perl проверяет переменную окружения PERL_USE_UNSAFE_INC в момент запуска и если переменная определена, то в @INC будет добавлен "." как прежде (как пример: alias perl="env PERL_USE_UNSAFE_INC=1 perl");
- Если допустимо добавление "." первым элементом в @INC, то можно использовать схему perl -I. (например alias perl="perl -I." в рабочей сессии окружения)
- Оператор "do" теперь выдает предупреждения на попытку загрузки файла который не нашелся в @INC без ".", но обнаружился в текущей директории. Файл может быть загружен путем явного указания пути: 'do "./file.pl"'. Выполнение с "-I." и использование PERL_USE_UNSAFE_INC не приводит к предупреждениям при использовании do.
- В регулярных выражениях открывающая фигурная скобка "{" должна быть экранирована или заключена в определитель класса "[{]". Данное нововведение дает возможность для реализации новых конструкции в регулярных выражениях в будущем. В perldiag (http://search.cpan.org/~xsawyerx/perl-5.26.0/pod/perldiag.pod) в секции "Unescaped left brace in regex is deprecated here" можно найти детали, например, о случаях когда "{" может не экранироваться.
Ключевые изменения (http://search.cpan.org/~xsawyerx/perl-5.26.0/pod/perldelta.pod)
:
- С процедур лексической области видимости введенных в 5.18 снят статус экспериментальной возможности.
Попытка определить лексическую процедуру больше не приведет к ошибкам и предупреждению. Изменения введены таким образом, что сохранена обратная совместимость с ранее использованными схемами через использование "experimental::lexical_subs" и "lexical_subs" из "feature". Включение "lexical_subs" через "feature" не прервет выполнение программы, так как сохранилось в виде бездействующей заглушки и лексические процедуры теперь доступны всегда в областях видимости без их явного включения;
- Введена поддержка выравнивания встроенных документов (here-documents). Новый модификатор "~", добавленный в синтаксис объявления here-документов, дает понять синтаксическому анализатору, что в коде встроенный документ будет выровнен на величину пробельного символа (символы из группы whitespace). Это позволяет определить в программе следующую конструкцию которая выглядит без нарушения вложенности:
if (1) {
print {{~EOF;
Hello there
EOF
}
Обратите внимание на то, что лексический анализатор в процессе поиска лексем будет, во-первых, проверять выравнивание строк, и, во-вторых, удалять с начала строки here-документа такую же подстроку которая предшествует закрывающему элементу here-документа. То есть если в нашем примере перед EOF стоит "\t", то перед 'Hello there' будет попытка удалить "\t". Анализатор сообщит об ошибке выравнивания here-документов если перед "Hello there" не будет "\t". Если будет два или более "\t" перед "Hello there", то удалится только один;
- Новый модификатор регулярного выражения "/xx" который является своего рода "усиленной формой /x". Работает также как и "/x" с той лишь разницей, что с модификатором "/xx" в регулярном выражении игнорируются неэкранированные символы пробела и табуляции в определителе класса символов "[]".
Пример: выражение " q"=~/^[^1 2]q/x не даст результат того, что кроме 1 и 2 определен пробел в [^1 2]
а выражение " q"=~/^[^1 2]q/xx даст результат, так как пробел в [^1 2] игнорируется и снова выражение " q"!~/^[^1\ 2]q/xx дает результат;
- Новые переменные "@{^CAPTURE}", "%{^CAPTURE}" и "%{^CAPTURE_ALL}" для захвата результата работы регулярного выражения:
- "@{^CAPTURE}" - массив включающий в себя $1, $2 и т.д. по порядку; пример: "asdf"=~/a(s)d(f)/o даст 's' и 'f' в массив;
- "%{^CAPTURE}" - эквивалент "%+", использующийся для именованного захвата;
- "%{^CAPTURE_ALL}" эквивалент для "%-", использующийся для всех именованных захватов (от автора: мне не удалось установить соответствие "%{^CAPTURE_ALL}" и "%-", похоже, что "%{^CAPTURE}" и "%{^CAPTURE_ALL}" синонимы; не исключено, что это ошибка, требуется перепроверка).
- Новая экспериментальная конструкция: объявление ссылок на переменную. В Perl 5.22.0 была введена экспериментальная конструкция присваивания к ссылке ("use feature 'refaliasing'"), которая позволяет определить псевдоним. Как логическое продолжение данной идеи теперь реализована возможность объявления ссылки на переменную в виде "my \$x" (эквивалент "\my $x"). Данная возможность включается через "use feature 'declared_refs'" и позволяет использовать схему "my ($foo, \@bar, \%baz)" - эквивалентен записи my $foo, \my(@bar, %baz). Обе схемы работают с my(), state(), our() и local();
- Поддержана спецификация Unicode 9.0 (http://www.unicode.org/versions/Unicode9.0.0/). Поддержка модулями из core Perl реализована через приведение нормализатора форм Unicode::Normalize к соответствию стандарту Unicode 9.0;
- На платформах которые поддерживают UTF-8 по умолчанию для сопоставления данных теперь используется кодировка UTF-8.
Для портируемости рекомендуется использовать Unicode::Collate. Подробности в разделе "Category LC_COLLATE: Collation: Text Comparisons and Sorting" в perllocale (http://search.cpan.org/~xsawyerx/perl-5.26.0/pod/perllocale.pod);
- Возможность косвенного вызова функции интерпретатора perl для массивов и хэшей. Функции обработки массивов и хешей (keys, each, values, push, pop, shift, unshift и splice) пространства имен CORE могут быть вызваны как через форму с префиксом "&" (&CORE::keys(\%hash)), так и косвенным вызовом (my $k = \&CORE::keys; $k->(\%hash)). До 5.26.0 эти формы приводили к ошибке выполнения;
- Новый алгоритм хэширования для 64-битных сборок. Для лучшей производительности реализована схема гибридного хэширования: для коротких ключей до 16 бит включительно используется оптимизированный вариант алгоритма "One At A Time Hard", для длинных ключей используется "Siphash 1-3". Данная схема показала значительный прирост в производительности для очень длинных ключей и умеренный прирост для остальных случаев.
Изменения, нарушающие совместимость:
- Конструкция scalar(%hash) теперь возвращае...
URL: http://www.nntp.perl.org/group/perl.perl5.porters/2017/05/ms...
Новость: http://www.opennet.ru/opennews/art.shtml?num=46628