Выпуск 28. Июнь 2015
← Что нового в Perl 5.22 | Содержание | Обзор CPAN за май 2015 г. →Полный список изменений в Perl 5.22.0
Перевод документа perl5220delta.pod на русский язык
Название
perl5220delta - что нового в perl v5.22.0
Описание
Этот документ описывает изменения между релизом 5.20.0 и 5.22.0.
Если вы обновляетесь с более раннего релиза, как например, 5.18.0, сначала прочтите perl5200delta, который описывает отличия между 5.18.0 и 5.20.0.
Базовые улучшения
Новые битовые операторы
Была добавлена новая экспериментальная возможность, которая позволяет четырём стандартным битовым операторам (& | ^ ~
) всегда воспринимать свои операнды как числа, а также представляет четыре новых оператора с точкой (&. |. ^. ~.
), которые соответственно трактуют операнды как строки. Тоже самое справедливо и для их вариаций с присвоением (&= |= ^= &.= |.= ^.=
).
Для активации этой возможности необходимо подключить возможность “bitwise” и отключить категорию предупреждений “experimental::bitwise”. Смотрите подробности в “Bitwise String Operators” in perlop и [perl #123466].
Новый оператор двойной ромб
<<>>
подобен <>
, но использует трёхаргументный вызов open
для открытия файлов из @ARGV
. Это также означает, что каждый элемент @ARGV
будет рассматриваться как имя файла, и, например, "|foo"
не будет трактоваться как открытие канала.
Новые границы в \b
для регулярных выражений
qr/\b{gcb}/
gcb
— сокращение от Grapheme Cluster Boundary (граница кластера графемы). Это свойство Юникода, которое ищет границы между последовательностью символов, которые являются представлением одного символа для носителя языка. В Perl давно поддерживалась такая возможность с использованием последовательности экранирования \X
. Теперь же появился альтернативный способ. Смотрите подробности в “, , , ” in perlrebackslash
qr/\b{wb}/
wb
— сокращение от Word Boundary (граница слова). Это свойство Юникода, которое ищет границы между словами. Это полностью совпадает с обычным \b
(без угловых скобок), но больше подходит при обработке текстов на естественных языках. Свойство, к примеру, знает, что апостроф может находиться в середине слова. Подробнее смотрите в “, , , ” in perlrebackslash.
qr/\b{sb}/
sb
— сокращение от Sentence Boundary (граница предложения). Это свойство Юникода, которое помогает при разборе предложений на естественных языках. Смотрите подробности в “, , , ” in perlrebackslash.
Флаг регулярных выражений для отключения захвата
Регулярные выражения теперь поддерживают флаг /n
, который отключает захват и заполнение переменных $1
, $2
, и прочих внутри группировки:
"hello" =~ /(hi|hello)/n; # $1 не устанавливается
Это эквивалентно установке ?:
в начале каждой захватывающей группы.
Смотрите подробности в “n” in perlre.
use re 'strict'
Это выражение включает строгие синтаксические правила к шаблонам регулярных выражений, скомпилированным в области видимости данной прагмы. Это позволит предупредить вас об опечатках и других нежелательных последствиях, о которых нет возможности сообщить при обычной компиляции регулярных выражений из-за соображений обратной совместимости. Поскольку поведение подобной прагмы может измениться в будущих версиях Perl, по мере накопления опыта её применения, её использование приводит к выводу предупреждения категории experimental::re_strict
. Смотрите подробнее в [‘strict’ в re](https://metacpan.org/pod/re#‘strict’ mode).
Поддерживается Юникод 7.0 (с корректировками)
Подробнее детали о том, что есть в этом релизе смотрите в http://www.unicode.org/versions/Unicode7.0.0/. Версия Юникод 7.0, поставляемая с Perl, включает корректировки, имеющие отношения к формированию Арабских глифов (смотрите http://www.unicode.org/errata/#current_errata).
use locale
может ограничивать затронутые категории локалей
Теперь появилась возможность передавать параметр в use locale
для указания списка категорий локали, для которых будут применяться правила локали, оставляя остальные категории незатронутыми. Подробности смотрите в [“The”use locale" pragma" in perllocale](https://metacpan.org/pod/perllocale#The%20“use%20locale”%20pragma).
Perl теперь поддерживает дополнения локальной валюты POSIX 2008
На платформах, которые поддерживают стандарт POSIX.1-2008, хеш, возвращаемый POSIX::localeconv()
, включает дополнительные поля национальной валюты, определённые этой версией POSIX стандарта. Это следующие поля:
int_n_cs_precedes
, int_n_sep_by_space
, int_n_sign_posn
, int_p_cs_precedes
, int_p_sep_by_space
, и int_p_sign_posn
.
Лучшая эвристика на старых платформах для определения является ли локаль UTF-8
На платформах, которые не реализовали ни стандарт C99, ни стандарт POSIX 2001, определение, является ли локаль UTF-8 или нет, зависит от эвристики. Которая была улучшена в этом релизе.
Псевдонимы через ссылки
Переменным и подпрограммам теперь можно задавать псевдонимы, присваивая к ссылке:
\$c = \$d;
\&x = \&y;
Псевдонимы также могут быть назначены с использованием обратного слеша перед переменной итерации foreach
; это, вероятно, одна из наиболее полезных идиом, которые предоставляет данная возможность:
foreach \%hash (@array_of_hash_refs) { ... }
Эта возможность экспериментальная и должна включаться с помощью use feature 'refaliasing'
. Она выводит предупреждение, если не отключена категория предупреждений experimental::refaliasing
.
Смотрите “Assigning to References” in perlref.
prototype
без аргументов
prototype()
без аргументов теперь подразумевает использование значения $_
. [perl #123514].
Новый атрибут функции :const
Атрибут const
может быть применён к анонимным функциям. Это приводит к тому, что функция немедленно исполняется всякий раз, когда создаётся (то есть когда обрабатывается выражение sub
). Её значение запоминается и используется для создания новой функции-константы, которая и возвращается. Это возможность экспериментальная. Смотрите “Constant Functions” in perlsub.
fileno
теперь работает и с дескрипторами директории
Если подобная возможность поддерживается в операционной системе, то встроенный fileno
поддерживает работу с дескрипторами директорий, обрабатывая указанный файловый дескриптор, как файловый хендлер. На операционных системах без подобной поддержки fileno
на дескрипторе директории продолжит возвращать неопределённое значение, как раньше, но также будет устанавливать $!
для указания того, что операция не поддерживается.
На данный момент используется поле dd_fd
в структуре ОС DIR
или функция dirfd(3)
, как определено в стандарте POSIX.1-2008.
Списочная форма записи для открытия канала реализована на Win32
Списочная форма записи для открытия канала:
open my $fh, "-|", "program", @arguments;
теперь реализована на Win32. Она имела те же ограничения, как и system LIST
на Win32, т.к. Win32 API не поддерживает передачу аргументов программе в виде списка.
Присвоение списку с повторением
(...) x ...
может быть теперь использован внутри списка, которому производится присвоение, пока левая сторона является lvalue. Это позволяет записывать (undef,undef,$foo) = that_function()
как ((undef)x2, $foo) = that_function()
.
Улучшена обработка Infinity (бесконечность) и NaN (не-число)
Значения с плавающей запятой способны хранить специальные значения бесконечности, отрицательной бесконечности и NaN (не-число). Теперь мы быстрее распознаём и передаём результаты вычисления, а на выводе нормализуем их в строковые значения Inf
, -Inf
, and NaN
.
Смотрите также улучшения в POSIX.
Улучшен разбор значений с плавающей запятой
Был улучшен разбор и вывод значений с плавающей запятой.
Как совершенно новая возможность, теперь поддерживается запись в виде шестнадцатеричных литералов (например, 0x1.23p-4
) и они могут быть выведены с помощью printf "%a"
. Смотрите подробности в “Scalar value constructors” in perldata.
Упаковка бесконечности или не-числа в символ теперь фатальная ошибка
Раньше, при попытке упаковки бесконечности или не-числа в (знаковый) символ, Perl предупреждал об этом и подразумевал, что вы пытаетесь упаковать 0xFF
; если вы передавали это как аргумент к chr
, то возвращался U+FFFD
.
Но сейчас все подобные действия (pack
, chr
и print '%c'
) приведут к фатальной ошибке.
Экспериментальное C API трассировки вызовов
Perl теперь поддерживает (через API C-уровня) получение трассировки вызовов уровня C (также как работают символьные отладчики, например, gdb).
Бэктрейс содержит трассировку стека фреймов C-вызовов с именами символов (именами функций), именами объектов (как, например, “perl”), а также, если возможно, расположение в исходном коде (файл:строка).
Поддерживаются платформы Linux и OS X (на некоторых *BSD также может работать, по крайне мере частично, но они ещё не тестировались).
Данная возможность должна быть включена с помощью Configure -Dusecbacktrace
.
Смотрите подробнее в “C backtrace” in perlhacktips.
Безопасность
Perl теперь компилируется с опцией -fstack-protector-strong
, если она доступна
Perl компилировался с опцией, предотвращающей переполнение буфера стека -fstack-protector
, начиная с 5.10.1. Теперь Perl использует более новый вариант -fstack-protector-strong
, если он доступен.
Модуль Safe допускал замещение внешних пакетов
Критическое исправление: внешние пакеты могли быть замещены. Safe был исправлен в версии 2.38.
Perl теперь всегда компилируется с опцией -D_FORTIFY_SOURCE=2
, если она доступна
Опция ‘закалки кода’, называемая _FORTIFY_SOURCE
, доступная в gcc 4.*, теперь всегда используется для компиляции Perl, если доступна.
Следует отметить, что это не обязательно значительное изменение, так как на многих платформах эта опция уже используется несколько лет: большинство Linux дистрибутивов (например, Fedora) используют эту опцию для Perl, а также в OS X она устанавливается уже много лет.
Несовместимые изменения
Сигнатура функции перемещена перед атрибутами
Экспериментальная возможность сигнатуры функции, появившаяся в 5.20, обрабатывала сигнатуру после атрибутов. В данном релизе, следуя отзывам пользователей этой экспериментальной возможности, позиция была перемещена так, чтобы сигнатура располагалась после имени подпрограммы (если есть) и перед списком атрибутов (если есть).
Прототипы &
и \&
допускают только функции
Символ прототипа &
теперь принимает только анонимные функции (sub {...}
), начинающиеся с \&
, или явный undef
. Прежде они ошибочно допускали использование ссылок на массивы, хеши и списки. [perl #4539]. [perl #123062]. [perl #123062].
Дополнительно, прототип \&
допускал вызов функции, тогда как сейчас он допускает только функции: &foo
по-прежнему допустимый аргумент, в то время как &foo()
и foo()
больше нет. [perl #77860].
use encoding
теперь лексическая
Прагма encoding теперь ограничена лексической областью видимости. Эта прагма устарела, но между тем, она может вредно воздействовать на другие модули, которые подключены в той же программе. Теперь это исправлено.
Срезы списков, возвращающие пустые списки
Срезы списков теперь возвращают пустой список, только если оригинальный список был пустым (или если нет индексов). Прежде срез списка возвращал пустой список если все индексы оказывались вне оригинального списка; теперь в этом случае возвращается список со значениями undef
. [perl #114498].
\\N{}
с последовательностью пробелов теперь является фатальной ошибкой
Например, \N{ОЧЕНЬ МНОГО ПРОБЕЛОВ}
или \N{ЗАВЕРШАЮЩИЙ ПРОБЕЛ }
. Это являлось устаревшей конструкцией, начиная с v5.18.
use UNIVERSAL '...'
теперь фатальная ошибка
Импортирование функций из UNIVERSAL
является устаревшей операцией, начиная с v5.12 и теперь это фатальная ошибка. use UNIVERSAL
без аргументов по-прежнему допускается.
В выражении \c_X_
, X должен быть печатным ASCII символом
В предыдущих релизах, невыполнение этого условия приводило к сообщению об устаревшей конструкции.
Разделение лексем (?
и (*
в регулярных выражениях теперь фатальная ошибка при компиляции.
Это является устаревшей конструкцией, начиная с v5.18.
qr/foo/x
теперь игнорирует все Юникод-шаблоны пробельного символа
Модификатор регулярного выражения /x
разрешал использование в шаблонах пробельных символов и комментариев (которые игнорировались) для удобства чтения. До текущего момента не все пробельные символы, которые стандарт Юникод обозначил для этих целей, поддерживались. Теперь также поддерживаются символы:
U+0085 NEXT LINE
U+200E LEFT-TO-RIGHT MARK
U+200F RIGHT-TO-LEFT MARK
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
Использование этих символов вместе с /x
вне классов символов, обособляемых скобками, и не предваряемых обратным слешем раньше, начиная с v5.18, выводило предупреждение об устаревшей конструкции. Теперь же они игнорируются.
Строки комментариев внутри (?[ ])
теперь могут завершаться только символом \\n
(?[ ])
— это экспериментальная возможность, появившаяся в v5.18. Она действует, как если бы был активирован модификатор /x
. Но есть отличие: строки комментариев (начинающиеся с символа #
) экранируются любым символом, который совпадает с \R
, что включает в себя все вертикальные пробелы, такие как разрыв страницы. Теперь, для согласованности, это поведение было изменено и для завершения строк комментариев вне (?[ ])
используется \n
(даже если экранирован), что является тем же символом, который завершает строку встроенного документа и формата.
Операторы (?[...])
теперь следуют стандарту приоритетов в Perl
Это экспериментальная возможность, которая разрешает операции с наборами в регулярных выражениях. До этого оператор пересечения имел тот же приоритет, что и другие бинарные операции. Теперь он имеет более высокий приоритет. Это может привести к отличному поведению, чем ожидает существующий код (хотя документация всегда отмечала, что это изменение может произойти и рекомендовала полностью брать выражение в скобки). Смотрите в “Extended Bracketed Character Classes” in perlrecharclass.
Опускание \%
и \@
перед именами хешей и массивов больше не допускается
Очень старые версии Perl допускали пропуск @
для имён массивов и %
у имён хешей в некоторых местах. Это приводило к предупреждению об устаревшей конструкции, начиная с Perl 5.000, и теперь больше не разрешено.
Текст $!
теперь на английском языке вне области действия use locale
Раньше текст, в отличии от всего другого, всегда базировался на текущей локали программы (также действовало на некоторых системах на "$^E"
). Для программ, которые неготовы обрабатывать отличия в локалях, это может приводить к отображению мусорного текста. Гораздо лучше отображать текст, который может быть переведён через определённые утилиты, чем мусор, который труднее распознать.
Текст $!
будет возвращён в UTF-8, если это приемлимо
Приведение к строковому значению $!
и $^E
установит флаг UTF-8, если текст является не-ASCII UTF-8. Это позволит программам, которые настроены на локале-зависимую работу, корректно выводит сообщения на естественном языке пользователя. Код, которому требуется оставить поведение 5.20 и более ранних версий, может приводить к строке в области действия прагм use bytes
и use locale ":messages"
. Внутри подобных областей никакие Perl операции не будут затронуты локалью, кроме приведения к строке значений $!
как $^E
. Прагма bytes
предотвратит установку флага UTF-8, также, как и в предыдущих Perl релизах. Это исправляет баг [perl #112208].
Удалена поддержка записи ?ШАБЛОН?
без явного оператора
Конструкция m?ШАБЛОН?
, которая допускает только одно совпадение в регулярном выражении, раньше имела альтернативную форму записи, которая позволяла опускать явный оператор m
. Подобное использование выдавало предупреждение об устаревшей конструкции, начиная с 5.14.0. Теперь это синтаксическая ошибка, освобождая символ вопроса для использования в новых операторах в будущем.
defined(\@array)
и defined(\%hash)
теперь фатальные ошибки
Эти конструкции устарели, начиная с v5.6.1, и выводили предупреждение об устаревшей конструкции, начиная с v5.16.
Использование хеша или массива как ссылки теперь фатальная ошибка
Например, %foo->{"bar"}
теперь приводит к фатальной ошибке при компиляции. Это устарело, начиная с v5.8 и с тех пор выводило предупреждение об устаревшей конструкции.
Изменения в прототипе *
Символ *
в прототипе подпрограммы раньше давал приоритет для bareword над большинством имён подпрограмм (но не над всеми). Это никогда не было последовательным и приводило к ошибочному поведению.
Теперь это было изменено и подпрограммы всегда получают приоритет над bareword, что приводит к согласованному поведению со встроенными функциями с аналогичными прототипами:
sub splat(*) { ... }
sub foo { ... }
splat(foo); # теперь всегда splat(foo())
splat(bar); # по-прежнему splat('bar'), как и раньше
close(foo); # close(foo())
close(bar); # close('bar')
Устаревшие конструкции
Установка ${^ENCODING}
в что-либо отличное от undef
Эта переменная позволяет писать Perl скрипты в кодировку отличную от ASCII или UTF-8. Однако она затрагивает все модули глобально, приводя к некорректным результатам и ошибкам сегментации. Новые скрипты должны писаться в UTF-8; старые должны быть сконвертированы в UTF-8, что может быть легко сделано с помощью утилиты piconv.
Использование неграфических символов в односимвольном имени переменной
Синтаксис для одно-буквенного имени переменной более снисходителен, чем для более длинных имён переменных, позволяя использовать одно-символьные имена с символами пунктуации или даже невидимыми (неграфическими). Perl v5.20 объявил устаревшим использование контрольных символов ASCII для подобных имён. Теперь все неграфические символы, которые формально были разрешены теперь считаются устаревшими. Практический эффект от этого происходит, только когда не действует use utf8
, и затрагивает только контрольные символы C1 (кодовые точки от 0x80 до 0xFF), NO-BREAK SPACE и SOFT HYPHEN.
Встраивание sub () { $var }
с заметным побочным эффектом
Во многих случаях Perl превращает sub () { $var }
во встраиваемую функцию-константу, захватывая значение $var
во время интерпретации выражения sub
. Это может нарушить замыкание в тех случаях, когда $var
в последствии модифицируется, поскольку подпрограмма не вернёт изменённое значение (это применимо только к анонимным подпрограммам с пустым прототипом (sub ()
)).
Подобное использование теперь считается устаревшим в тех случаях, когда переменная модифицируется. Perl фиксирует подобные случаи и выводит предупреждение об устаревшей конструкции. Подобный код в будущем скорее всего изменит своё поведение и перестанет возвращать константу.
Если ваша переменная изменяется только в месте, где она определена, то Perl продолжит создавать встраиваемую подпрограмму без каких-либо предупреждений.
sub make_constant {
my $var = shift;
return sub () { $var }; # приемлимо
}
sub make_constant_deprecated {
my $var;
$var = shift;
return sub () { $var }; # устаревшая конструкция
}
sub make_constant_deprecated2 {
my $var = shift;
log_that_value($var); # может изменить $var
return sub () { $var }; # устаревшая конструкция
}
Выше, во втором примере, достаточно сложно вычислить, что присвоение $var
делается только один раз. Это происходит в месте отличном от декларации my
, что достаточно для Perl, чтобы считать это подозрительным.
Это предупреждение об устаревшей конструкции происходит только для простых переменных в теле подпрограммы (блок BEGIN
или оператор use
внутри подпрограмм игнорируются, поскольку они не становятся частью тела подпрограммы). Для более сложных случаев, таких как sub () { do_something() if 0; $var }
, поведение изменилось и встраивания не происходит, если переменная изменяется где-либо ещё. Подобные случаи встречаются редко.
Использование нескольких подификаторов регулярных выражений /x
Теперь считается устаревшим использование подобных записей:
qr/foo/xx;
/(?xax:foo)/;
use re qw(/amxx);
Теперь x
должен встречаться только один раз в строке, содержащей модификаторы регулярного выражения. Мы не склонны считать, что подобные случаи встречаются на CPAN. Это подготовка к будущему релизу Perl, который будет иметь /xx
для разрешения пробелов для удобства чтения в классах символов заключённых в скобки (которые обособляются квадратными скобками: [...]
).
Использование неразрывного пробела в псевдонимах символа \\N{...}
считается устаревшим
Этот неграфический символ практически неотличим от обычного пробела и поэтому не должен допускаться. Смотрите “CUSTOM ALIASES” in charnames.
Литерал \{
теперь должен экранироваться в шаблоне
Если вам требуется литерал левой фигурной скобки в шаблоне регулярного выражения, вы должны экранировать его с помощью предшествующего обратного слеша, или включив его в квадратные скобки, или используя \Q
; в противном случае будет выведено предупреждение об устаревшей конструкции. Впервые об этом было анонсировано в релизе v5.16; это позволит в будущем расширить синтаксис языка.
Не рекомендуется установливать все предупреждения фатальными
Документация для фатальных предупреждений отмечает, что использование use warnings FATAL => 'all'
не рекомендуется и даёт общие пояснения по рискам использования фатальных предупреждений.
Улучшения в производительности
- Если метод или имя класса известны во время компиляции, то предварительно рассчитывается хеш для ускорения поиска методов во время исполнения. Также составные имена методов, такие как
SUPER::new
, разбираются во время компиляции, что снимает необходимость их обработки во время исполнения. - Поиск элемента в массивах и хешах (особенно во вложенных), при котором используется константа или простая переменная в качестве индекса/ключа, теперь работает гораздо быстрее. Смотрите подробнее в “Internal Changes”.
(...)x1
,("constant")x0
и($scalar)x0
теперь оптимизированы в списочном контексте. Если правый аргумент константа 1, оператор повтора исчезает. Если правый аргумент это константа 0, то всё выражение оптимизируется в пустой список, если левый аргумент это простой скаляр или константа (таким образом,(foo())x0
не оптимизируется).- Присвоение
substr
в конце подпрограммы (или как аргументreturn
) теперь оптимизируется в 4-х аргументныйsubstr
. Раньше это происходило только в пустом контексте. - В
"\L..."
,"\Q..."
и подобных случаях дополнительная операция приведения к строке теперь оптимизируется, делая их такими же быстрыми, какlcfirst
,quotemeta
, и так далее. - Присвоение пустому списку теперь иногда работает быстрее. В частности, теперь никогда не вызывается
FETCH
на связанные аргументы на правой стороне, в то время как раньше это иногда происходило. - Производительность
length
увеличена на 20% если применяется к немагической, несвязанной строке, или, если находится в области видимости прагмыuse bytes
, или если строка не использует внутри UTF-8. - На большинстве сборок perl с 64-битными целыми использование памяти для немагических, несвязанных скалярах, содержащих только значение с плавающей точкой было уменьшено от 8 до 32 байт в зависимости от ОС.
- В выражении
@array = split
присвоение может быть оптимизировано так, чтоsplit
будет записывать непосредственно в массив. Эта оптимизация раньше происходила только для массивов пакета, отличных от@_
и только иногда. Теперь эта оптимизация происходит практически всегда. join
теперь может выполнять свёртку констант. Например,join "-", "a", "b"
конвертируется во время компиляции в"a-b"
. Более того,join
со скаляром или константой в качестве разделителя с одно-элементным списком упрощается до операции приведения к строке, а разделитель даже не обрабатывается.qq(@array)
реализован с использованием двух операций: операция приведения к строке и операция объединения. Еслиqq
не содержит ничего кроме одного массива, то операция приведения к строке опускается.our $var
иour($s,@a,%h)
в пустом контексте больше не вычисляются во время выполнения. Даже вся последовательность выраженийour $foo;
будет просто пропущена. Тоже самое относится к переменнымstate
.- Множество внутренних функция было переработано, чтобы улучшить производительность и снизить их потребление памяти. [perl #121436] [perl #121906] [perl #121969]
- Файловые тесты
-T
и-B
завершаться раньше, если будет выявлено, что файл пустой. [perl #121489] - Поиск в хеше по ключу-константе происходит быстрее.
- Подпрограммы с пустыми прототипами и телом, содержащим только
undef
теперь могут встраиваться. [perl #122728] - Подпрограммы в пакетах больше не требуется сохранять в тайпглобах: объявление подпрограммы теперь помещает простую ссылку на подпрограмму непосредственно в стэш, если это возможно, экономя память. Тайпглоб по-прежнему номинально существует, попытка доступа к нему приведёт к модернизации стэша в тайпглоб (это просто детали внутренней реализации). Эта оптимизация на данный момент не применяется для XSUB или экспортированных подпрограмм, и вызов методов устранит её, поскольку они сохраняют кэш в тайпглобах. [perl #120441]
- Функции
utf8::native_to_unicode()
иutf8::unicode_to_native()
(смотрите utf8) теперь оптимизируются на ASCII платформах. Теперь нет ни малейшего снижения производительности при написании кода, переносимого между ASCII и EBCDIC платформ. - Win32 Perl использует меньше на 8 Кбайт памяти на каждый процесс, чем раньше, поскольку некоторые данные теперь отображаются в память с диска и разделяются между процессами одного исполняемого файла perl.
Модули и прагмы
Обновлённые модули и прагмы
Многие библиотеки, распространяемые вместе с perl были обновлены, со времени выхода v5.20.0. Для получения полного списка изменений можно выполнить:
corelist --diff 5.20.0 5.22.0
Вы также можете подставить нужную вам версию вместо 5.20.0.
Некоторые заметные изменения:
Archive::Tar был обновлён до версии 2.04.
Тесты теперь могут выполняться параллельно.
attributes был обновлён до версии 0.27.
Использование
memEQs
в XS было исправлено. [perl #122701]Предотвращено чтение за пределами границы буфера. [perl #122629]
B был обновлён до версии 1.58.
Он предоставляет новую функцию
B::safename
, основанную на существующейB::GV->SAFENAME
, которая конвертирует\cOPEN
в^OPEN
.Обнулённые COP’ы теперь имеют класс
B::COP
, вместоB::OP
.Объекты
B::REGEXP
теперь предоставляют методqr_anoncv
для доступа к неявным CV, ассоциированным сqr//
, содержащими кодовые блоки, а методcompflags
, который возвращает соответствующие флаги, относящиеся к операцииqr//blahblah
.B::PMOP
теперь предоставляет методpmregexp
, возвращающий объектB::REGEXP
. Были созданы два новых класса:B::PADNAME
иB::PADNAMELIST
.Была исправлена ошибка, когда после создания треда или псевдофорка, специальные или бессмертные SV в потомке треда/псевдофорка не имеют корректного класса
B::SPECIAL
. Были добавлены методы PADLISTid
иoutid
.B::Concise был обновлён до версии 0.996.
Нулевые операции, которые являются частью цепи исполнения теперь получают соответствующие порядковые номера.
Закрытые флаги для нулевых операций теперь выводятся с мнемоникой, как и у ненулевых операций.
B::Deparse был обновлён до версии 1.35.
Теперь он корректно депарсит
+sub : attr { ... }
с начала выражения. Без начального+
,sub
стал бы меткой оператора.Блоки
BEGIN
теперь появляются в нужных местах в большинстве случаев, но это изменение, к сожалению, приводит к регрессии, при которой блокиBEGIN
, находящиеся прямо перед концом блока могут оказаться после него.B::Deparse
больше не помещает некорректныеlocal
тут и там, как например, вLIST = tr/a//d
. [perl #119815]Соседние операторы
use
больше не вкладываются, если один из них содержит блокdo
. [perl #115066]Массивы в скобках в списке, передаваемом с
\
теперь корректно депарсятся со скобками (то есть,\(@a, (@b), @c)
теперь сохранит скобки вокруг @b), предотвращая от выравнивания массивов в списке по ссылке. Раньше это работало только для одного массива:\(@a)
.local our
теперь корректно депарсится, с включённымour
.for($foo; !$bar; $baz) {...}
депарсился без!
(илиnot
). Это было исправлено.Базовые ключевые слова, которые конфликтуют с лексическим подпрограммами теперь депарсятся с префиксом
CORE::
.foreach state $x (...) {...}
теперь корректно депарсится соstate
, а не сmy
.our @array = split(...)
теперь депарсится корректно сour
в тех случаях, когда выражение оптимизируется.Теперь депарсятся корректно
our(_LIST_)
и типизированное лексическое (my Dog $spot
).$#_
теперь депарсится корректно, вместо$#{_}
. [perl #123947]Блоки BEGIN в конце замыкающей области видимости теперь депарсятся в нужном месте. [perl #77452]
Блоки BEGIN иногда депарсились, как __ANON__, но теперь всегда называются BEGIN.
Лексические подпрограммы теперь полностью депарсятся. [perl #116553]
Anything =~ y///r
с/r
больше не пропускают левый операндюДерево операций, которые формируют кодовый блок regexp теперь депарсятся по-настоящему. Раньше использовалась оригинальная строка, которая создавала регулярное выражение. Это приводило к проблемам с
qr/(?{<<heredoc})/
и многострочным блокам кода, которые депарсились некорректно. [perl #123217] [perl #115256]$;
в конце оператора больше не теряет точку с запятой. [perl #123357]Некоторые случаи объявления подпрограмм, сохраняемые в стеше в краткой форме пропускались.
Не-ASCII символы теперь последовательно экранируются в строках, без пропусков. (По-прежнему есть проблемы с регулярными выражениями и идентификаторами, которые ещё не исправлены.)
Когда прототип вызова подпрограммы депарсится с
&
(например, с опцией -P), теперь добавляетсяscalar
, когда это требуется, чтобы принудительно установить скалярный контекст, подразумеваемый прототипом.require(foo())
,do(foo())
,goto(foo())
и схожие конструкции с контролем циклов теперь корректно депарсятся. Внешние скобки не опциональные.Пробельные символы больше не экранируются в регулярных выражениях, из-за того, что они ошибочно были экранированы внутри секции
(?x:...)
.sub foo { foo() }
теперь депарсится с этими обязательными скобками./@array/
теперь депарсится как регулярное выражение, а не просто@array
./@{-}/
,/@{+}/
и$#{1}
теперь депарсятся с фигурными скобками, которые обязательны в этих случаях.При депарсинге связок фич,
B::Deparse
выводил сначалаno feature;
, вместо выводаno feature ':all';
. Это было исправлено.chdir FH
теперь депарсится без кавычек.\my @a
теперь депарсится без скобок. (Скобки выравняют массив).system
иexec
с последующим блоком теперь депарсятся корректно. Раньше появлялся ошибочныйdo
перед блоком.use constant QR => qr/.../flags
с последующим"" =~ QR
больше не появляются без флагов.Депарсинг
BEGIN { undef &foo }
с включённой опцией -w начало выводить предупреждение о неинициализированности в Perl 5.14. Теперь это было исправлено.Вызов депарсинга к подпрограммам с прототипом
(;+)
приводил к бесконечному циклу. Прототипы(;$
),(_)
и(;_)
получали неправильный порядок приоритетов, приводя к депарсингуfoo($a<$b)
без скобок.Deparse теперь предоставляет определённую state подпрограмму во внутренних подпрограммах.
Был добавлен B::Op_private
B::Op_private предоставляет детальную информацию о флагах, используемых в поле
op_private
опкодов Perl.bigint, bignum, bigrat были обновлены до версии 0.39.
Задокументировано в секции CAVEATS (предостережение), что использование строк как чисел не всегда приводит к перегрузке больших чисел, а также информацию о том как вызвать её. [rt.perl.org #123064]
Carp был обновлён до версии 1.36.
Carp::Heavy
теперь игнорирует несовпадение версий с Carp, если Carp новее, чем 1.12, так как начинкаCarp::Heavy
была внесена в Carp в этой версии. [perl #121574]Carp теперь лучше поддерживает не-ASCII платформы.
Исправлена ошибка на единицу для Perl < 5.14.
constant был обновлён до версии 1.33.
Он теперь поддерживает полные имена констант, позволяя определять константы в пакетах отличных от пакеты вызывающего кода.
CPAN был обновлён до версии 2.11.
Была добавлена поддержка
Cwd::getdcwd()
и внесено обходное решение для ошибочного поведения, которое наблюдалось на Strawberry Perl 5.20.1.Исправлена ошибка с
chdir()
после сборки зависимостей.Введена экспериментальная поддержка для плагинов/хуков.
Интегрированы исходники
App::Cpan
.Не проверяется рекурсия для опциональных зависимостей.
Проверка на вменяемость, что
META.yml
содержит хеш. [cpan #95271]CPAN::Meta::Requirements был обновлён до версии 2.132.
Обход ограничения в
version::vpp
для определения магии v-строк и добавление поддержки грядущему бутстрапуversion.pm
в ExtUtils::MakeMaker для Perl старее чем 5.10.0.Data::Dumper был обновлён до версии 2.158.
Исправлена уязвимость CVE-2014-4330 путём добавления переменной конфигурации или опции для ограничения рекурсии, при выводе глубоко-вложенных структур.
Изменения для исправления ошибок найденных сканером безопасности Coverity. XS выводит некорректно сохранённое имя кодовой ссылки, хранимое в GLOB. [perl #122070]
DynaLoader был обновлён до версии 1.32.
Удалена глобальная переменная
dl_nonlazy
, если не используется в Dynaloader. [perl #122926]Encode был обновлён до версии 2.72.
piconv
теперь лучше отлавливает ошибки, когда имя кодировки не существует и исправлен разлом сборки при обновлении Encode в perl-5.8.2 и более ранних версий.Теперь работает сборка в C++ режиме на Windows.
Errno был обновлён до версии 1.23.
Добавлена опция
-P
для препроцессора в GCC 5. GCC добавил дополнительную строковую директиву, которая сломала разбор определений кодов ошибок. [rt.perl.org #123784]experimental был обновлён до версии 0.013.
Зашиты возможности для Perl старше 5.15.7.
ExtUtils::CBuilder был обновлён до версии 0.280221.
Исправлена регрессия на Android. [perl #122675]
ExtUtils::Manifest был обновлён до версии 1.70.
Исправлена ошибка с обработкой файловых имён с кавычками в
maniread()
и улучшенmanifind()
, теперь следующий по ссылкам. [perl #122415]ExtUtils::ParseXS был обновлён до версии 3.28.
Объявляет
file
неиспользуемым только если его действительно определили. Улучшена генерация кодаRETVAL
, чтобы избежать повторения ссылок наST(0)
. [perl #123278] Расширена и задокументирована typemap оптимизация/OBJ$/
в/REF$/
для методаDESTROY
. [perl #123418]Fcntl был обновлён до версии 1.13.
Была добавлена поддержка работы с размером буфера канала в Linux в командах
fcntl()
.File::Find был обновлён до версии 1.29.
find()
иfinddepth()
будут предупреждать, если передана некорректная или опция с опечаткой.File::Glob был обновлён до версии 1.24.
SvIV()
избегает расширения для вызоваget_sv()
три раза в нескольких местах. [perl #123606]HTTP::Tiny был обновлён до версии 0.054.
keep_alive
теперь безопасен для вызова fork или запуска новых тредов.IO был обновлён до версии 1.35.
XS реализация была исправлена для поддержки работы на старых Perl.
IO::Socket был обновлён до версии 1.38.
Задокументированы ограничения метода
connected()
. [perl #123096]IO::Socket::IP был обновлён до версии 0.37.
Более лучшее исправление для субкласса
connect()
. [cpan #95983] [cpan #97050]Реализован таймаут для
connect()
. [cpan #92075]Коллекция модулей libnet была обновлена до версии 3.05.
Поддержка для IPv6 и SSL для
Net::FTP
,Net::NNTP
,Net::POP3
иNet::SMTP
. Улучшения аутентификации вNet::SMTP
.Locale::Codes был обновлён до версии 3.34.
Исправлен баг в скриптах, используемых для извлечения данных из электронных таблиц, которые препятствовали поиску SHP коду валюты. [cpan #94229]
Были добавлены новые коды.
Math::BigInt был обновлён до версии 1.9997.
Синхронизированы изменения в POD вместе со CPAN выпуском.
Math::BigFloat->blog(x)
иногда возвращаетblog(2*x)
, когда точность больше 70 цифр. РезультатMath::BigFloat->bdiv()
в списочном контексте теперь удовлетворяетx = quotient * divisor + remainder
.Исправлена обработка субклассов. [cpan #96254] [cpan #96329]
Module::Metadata был обновлён до версии 1.000026.
Поддержка инсталляции на старых perl вместе с версиями ExtUtils::MakeMaker более ранних чем 6.63_03
overload был обновлён до версии 1.26.
Ненужная проверка
ref $sub
была удалена.Коллекция модулей PathTools была обновлена до версии 3.56.
Избегаются предупреждения компилятора gcc теперь при сборке XS.
//
в начале строки не заменяется на/
на Cygwin. [perl #122635]perl5db.pl был обновлён до версии 1.49.
Отладчик вызывал нарушения предположения. [perl #124127]
fork()
в отладчике вtmux
теперь создаёт новое окно для созданного процесса. [perl #121333]Отладчик теперь сохраняет текущий рабочий каталог при запуске и восстанавливает его, когда вы перезапускаете вашу программу с помощью
R
илиrerun
. [perl #121509]PerlIO::scalar был обновлён до версии 0.22.
Чтение из позиции за пределами скаляра теперь корректно возвращает конец файла. [perl #123443]
Смещение в отрицательную позицию по-прежнему приводит к ошибке, но больше не оставляет позицию на отрицательном смещении.
eof()
наPerlIO::scalar
дескрипторе теперь корректно возвращает истину, когда файловая позиция превышает планку в 2 Гбайта на 32-битных системах.Попытка записи в файловую позицию недопустимую для платформы теперь сразу приводит к ошибке, а не падает после выделения 4 Гбайт.
Pod::Perldoc был обновлён до версии 3.25.
Файловые дескрипторы открытые для чтения или записи теперь имеют установленный
:encoding(UTF-8)
. [cpan #98019]POSIX был обновлён до версии 1.53.
Были добавлены математические функции и константы C99 (например,
acosh
,isinf
,isnan
,round
,trunc
;M_E
,M_SQRT2
,M_PI
).POSIX::tmpnam()
теперь выводит предупреждение об устаревшей конструкции. [perl #122005]Safe был обновлён до версии 2.39.
reval
не распространял корректно пустой контекст.Scalar-List-Utils был обновлён до версии 1.41.
Был добавлен новый модуль Sub::Util, содержащий функции, относящиеся к кодовым ссылкам, включая
subname
(по мотивамSub::Identity
) иset_subname
(скопированная и переименованная изSub::Name
). ИспользованиеGetMagic
вList::Util::reduce()
также было исправлено. [cpan #63211]SDBM_File был обновлён до версии 1.13.
Упрощён процесс сборки. [perl #123413]
Time::Piece был обновлён до версии 1.29.
При печати отрицательных
Time::Seconds
, “минус” больше не теряется.Unicode::Collate был обновлён до версии 1.12.
Улучшенные несмежные сокращения версии 0.67 сделаны недействительными по умолчанию и поддерживаются как параметр
long_contraction
.Unicode::Normalize был обновлён до версии 1.18.
Реализация XSUB была удалена, предпочтение отдано реализации на чистом Perl.
Unicode::UCD был обновлён до версии 0.61.
Была добавлена новая функция property_values() возвращающая возможные значения для заданного свойства.
Была добавлена новая функция charprop(), возвращающая значение данного свойства по заданной кодовой точке.
Была добавлена новая функция charprops_all(), возвращающая значения всех свойств Юникода для заданной кодовой точки.
Исправлен ошибка, когда propaliases() возвращает корректное короткое и длинные имена для Perl расширений, в которых они некорректны.
Исправлена ошибка, когда prop_value_aliases() возвращает
undef
вместо некорректного результата для свойств, которые являются Perl расширениями.Модуль теперь работает на EBCDIC платформах.
utf8 был обновлён до версии 1.17
Было исправлено несоответствие между документацией и кодом в
utf8::downgrade()
в соответствии с документацией. Опциональный второй аргумент теперь корректно интерпретируется как логическое значение (семантика истина/ложь), а не как целое число.version был обновлён до версии 0.9909.
Многочисленные изменения. Смотрите файл
Changes
в CPAN дистрибутиве.Win32 был обновлён до версии 0.51.
GetOSName()
теперь поддерживает Windows 8.1 и сборку в режиме C++.Win32API::File был обновлён до версии 0.1202
Работает сборка в режиме C++.
XSLoader был обновлён до версии 0.20.
В XSLoader разрешена загрузка модулей их другого пространства имён. [perl #122455]
Удалённые модули и прагмы
Следующие модули (и связанные модули) были удалены из базового дистрибутива perl:
Документация
Новая документация
perlunicook
Этот документ, созданный Томом Христиансеном, содержит примеры работы с Юникодом в Perl.
Изменения в существующей документации
perlaix
- Было добавлено замечание о long double.
perlapi
- Замечание, что
SvSetSV
не устанавливает магию. sv_usepvn_flags
- исправление документации с упоминанием использованияNewx
вместоmalloc
.- Уточнение, где
NUL
может быть встроен или требуется для завершения строки. - Некоторая документация, которая раньше отсутствовала из-за ошибок форматирования теперь включена.
- Элементы теперь организованы по группам, а не файлам, в которых они находятся.
Сортировка по алфавиту элементов теперь выполняется согласованно (автоматически POD-генератором), чтобы быстрее найти данные при поиске.
perldata
- Синтаксис одно-буквенных имён переменных был обновлён и более детально объяснён.
- Описаны шестнадцатеричные числа с плавающей запятой, а также infinity и NaN.
perlebcdic
- Это документ был значительно обновлён в свете последних улучшений поддержки платформы EBCDIC.
perlfilter
- Добавлена секция LIMITATIONS.
perlfunc
- Упоминается, что
study()
на данный момент пустая операция. - Вызов
delete
илиexists
на значения массива теперь описана как “решительно неприемлемым” вместо “устаревшим”. - Улучшена документация
our
. Для
-l
теперь упоминается, что он возвращает ложь, если символьные ссылки не поддерживаются файловой системой.Замечание, что
exec LIST
иsystem LIST
могут откатываться в вызов командной строки на Win32. Только неявный объектный синтаксисexec PROGRAM LIST
иsystem PROGRAM LIST
гарантировано позволит избежать запуск командной оболочки.Это также было добавлено в perlport.
perlguts
- Пример с OOK был обновлён с учётом изменений COW и изменений в хранении смещения.
- Добавлены подробности о символах C-уровня и libperl.t.
- Добавлена информация о работе с Юникодом.
- Добавлена информация о поддержке EBCDIC.
perlhack
- Была добавлена информация о запуске на платформах с набором не-ASCII символов.
- Было добавлено замечание о тестировании производительности
perlhacktips
- Была добавлена документация, иллюстрирующая риски самонадеянности, что нет изменений в содержимом статической памяти, на которую указывает возвращаемое значение Perl-обёртки для библиотечных C-функций.
- Замены для
tmpfile
,atoi
,strtol
иstrtoul
теперь рекомендуются. Обновлена документация для цели
make
test.valgrind
.- Дана информация о написании файлов тестов переносимых на не-ASCII платформы.
Была добавлено заметка о том, как получить трассировку стека вызовов языка C.
perlhpux
- Замечание о том, что сообщение “Повторное объявление”sendpath" с отличающимся описанием класса хранения" безобидно.
perllocale
- Обновлено данными об улучшениях, появившихся в v5.22, вместе с некоторыми пояснениями.
perlmodstyle
- Вместо указания на список модулей, мы теперь указываем на PrePAN.
perlop
- Обновлено данными об улучшениях, появившихся в v5.22, вместе с некоторыми пояснениями.
perlpodspec
- Спецификация языка pod изменена, кодировка по умолчанию для pod, которые не в UTF-8 (или иначе обозначенные), теперь CP1252 вместо ISO 8859-1 (Latin1).
perlpolicy
- Теперь у нас есть правила поведения для почтового списка рассылки p5p, задокументированные в “STANDARDS OF CONDUCT” in perlpolicy.
- Указаны условия, при которых экспериментальные возможности перестают быть экспериментальными.
- Были сделаны уточнения по типам изменений, которые допустимы в релизах сопровождения.
perlport
- Устаревшая специфичная для VMS информация была исправлена и/или упрощена.
- Были добавлены замечания о EBCDIC.
perlre
- Было уточнено описание модификатора
/x
, чтобы отметить, что комментарии не могут быть продолжены на следующей строке путём экранирования их; кроме того теперь есть список всех символов, которые рассматриваются этим модификатором как пробельные. - Описан новые модификатор
/n
. - Было добавлено заметка о том, как сделать классы символов, обособленные скобками, переносимыми на не-ASCII машины.
perlrebackslash
- Добавлена документация по
\b{sb}
,\b{wb}
,\b{gcb}
и\b{g}
.
perlrecharclass
- Были добавлены пояснения в “Character Ranges” in perlrecharclass об эффекте
[A-Z]
,[a-z]
,[0-9]
и любых поддиапазонов в обособленных скобками классах символов в регулярных выражениях, который гарантирует, что произойдёт совпадение только с тем, что ожидает неподготовленный англоговорящий пользователь, даже на платформах (таких как EBCDIC), где требуется специальные манипуляции для достижения этой цели. - Документация обособленных скобками классов символов была расширена, осветив улучшения в
qr/[\N{named sequence}]/
(смотрите “Selected Bug Fixes”).
perlref
- Была добавлена новая секция Присвоение ссылкам
perlsec
- Были добавлены комментарии об алгоритмической сложности и связанных хешах.
perlsyn
- Была исправлена неоднозначность в документации, касаемая оператора
...
. [perl #122661] - Пустое условие в
for
иwhile
теперь задокументировано в perlsyn.
perlunicode
- Документация была значительно переработана для соответствия с текущей поддержкой Юникода и, чтобы сделать её более читабельной. Заметно, что Юникод 7.0 изменил поведение в отношении не-символов. Perl сохранил старый способ работы по причинам обратной совместимости. Смотрите “Noncharacter code points” in perlunicode.
perluniintro
- Был обновлён совет о том, как быть уверенным, что строки и шаблоны регулярных выражений интерпретируются как Юникод.
perlvar
$]
больше не считается устаревшей. Вместо этого была добавлено обсуждение о преимуществах и недостатках использования её вместо$^V
.${^ENCODING}
теперь считается устаревшей.- Была уточнена запись о
%^H
для указания, что она может хранить только простые значения.
perlvms
- Устаревший и/или некорректный материал был удалён.
- Обновлена документация об окружении и взаимодействии с оболочкой на VMS.
perlxs
- Добавлено обсуждение о проблемах с локалью в XS коде.
Диагностика
Следующие добавления и изменения были сделаны в диагностическом выводе, включая предупреждения и фатальные сообщения об ошибках. Для полного перечная диагностических сообщений смотрите perldiag.
Новая диагностика
Новые ошибки
-
- Внутренний запрос попросил добавить скалярную запись к чему-то, что не является записью в таблице символов.
[Can’t use a hash as a reference](https://metacpan.org/pod/perldiag#Can’t use a hash as a reference)
- Вы попытались использовать хеш как ссылку, например,
%foo->{"bar"}
или%$ref->{"hello"}
. Версии perl <= 5.6.1 разрешали подобный синтаксис, хотя этого не следовало делать.
- Вы попытались использовать хеш как ссылку, например,
[Can’t use an array as a reference](https://metacpan.org/pod/perldiag#Can’t use an array as a reference)
- Вы попытались использовать массив как ссылку, например,
@foo->[23]
или@$ref->[99]
. Версии perl <= 5.6.1 разрешали подобный синтаксис, хотя этого не следовало делать.
- Вы попытались использовать массив как ссылку, например,
[Can’t use ‘defined(@array)’ (Maybe you should just omit the defined()?)](https://metacpan.org/pod/perldiag#Can’t use ‘defined(@array)’ (Maybe you should just omit the defined()?))
defined()
бесполезен для массивов поскольку он проверяет на неопределённость значение скаляра. Если вы хотите проверить является ли массив пустым просто используйте, например,if (@array) { # не пустой }
.
[Can’t use ‘defined(%hash)’ (Maybe you should just omit the defined()?)](https://metacpan.org/pod/perldiag#Can’t use ‘defined(%hash)’ (Maybe you should just omit the defined()?))
defined()
не совсем то, что нужно для хешей.
Хотя
defined %hash
является ложью на простом неиспользованном хеше, это становится истиной в некоторых неочевидных случаях, включая использования итераторов, слабых ссылок, имён стэшей и даже остаётся истиной послеundef %hash
. Это делаетdefined %hash
довольно бесполезным на практике, поэтому сейчас он вызывает фатальную ошибку.Если вам требуется проверка на то, что хеш не пустой, просто поставьте его в логический контекст (смотрите “Scalar values” in perldata):
if (%hash) { # not empty }
Если вы использовали
defined %Foo::Bar::QUUX
для проверки, что существует подобная переменная пакета, то это никогда не было надёжно и не является правильным путём запроса о возможностях пакета или проверки того, что он загружен и так далее.-
- Вы передали некорректное число (например, бесконечность или не-число) в
chr
.
- Вы передали некорректное число (например, бесконечность или не-число) в
-
- Вы пытались конвертировать бесконечность или не-число в беззнаковый символ, что является бессмысленным.
-
- Вы пытались конвертировать бесконечность или не-число в символ, что является бессмысленным.
-
- Вы попытались напечатать бесконечность или не-число как символ (
%c
), что не имеет смысла. Возможно вы имели ввиду'%s'
или просто привести его к строковому виду.
- Вы попытались напечатать бесконечность или не-число как символ (
charnames alias definitions may not contain a sequence of multiple spaces
- Вы определили имя символа, который имеет несколько пробельных символов подряд. Замените их на один пробел. Обычно эти имена определены в аргументе импорта
:alias
дляuse charnames
, но они также могут быть определены переводчиком и располагаться в$^H{charnames}
. Смотрите “CUSTOM ALIASES” in charnames.
- Вы определили имя символа, который имеет несколько пробельных символов подряд. Замените их на один пробел. Обычно эти имена определены в аргументе импорта
charnames alias definitions may not contain trailing white-space
- Вы определили имя символа, который завершается на пробельный символ. Удалите завершающий пробел. Обычно эти имена определены в аргументе импорта
:alias
дляuse charnames
, но они также могут быть определены переводчиком и располагаться в$^H{charnames}
. Смотрите “CUSTOM ALIASES” in charnames.
- Вы определили имя символа, который завершается на пробельный символ. Удалите завершающий пробел. Обычно эти имена определены в аргументе импорта
:const is not permitted on named subroutines
- Атрибут
const
используется, чтобы анонимная подпрограмма запускалась и захватывала значение в тоже время, в которое оно клонируется. Именованная подпрограмма не может быть клонирована подобным образом, поэтому атрибут для неё не имеет смысла.
- Атрибут
Hexadecimal float: internal error
- Произошло нечто ужасное в обработке шестнадцатеричного значения с плавающей запятой.
Hexadecimal float: unsupported long double format
- Вы сконфигурировали Perl для использования long double, но внутренняя реализация формата long double неизвестна, поэтому вывод шестнадцатеричного значения с плавающей запятой невозможен.
-
- Запуск скрипта под suidperl уже давно нелегален.
[In ‘(?…)’, the ‘(’ and ‘?’ must be adjacent in regex; marked by <– HERE in m/%s/](https://metacpan.org/pod/perldiag#In ‘(?…)’, the ‘(’ and ‘?’ must be adjacent in regex; marked by <– HERE in m/%s/)
- Двухсимвольная последовательность
"(?"
в этом контексте в шаблоне регулярного выражения должно быть неделимой лексемой и ничего не может находиться между"("
и"?"
, но вы разделили их.
- Двухсимвольная последовательность
[In ‘(VERB…)’, the ’(’ and ’’ must be adjacent in regex; marked by <– HERE in m/%s/](https://metacpan.org/pod/perldiag#In ‘(VERB…)’, the ’(’ and ’’ must be adjacent in regex; marked by <– HERE in m/%s/)
- Двухсимвольная последовательность
"(*"
в этом контексте в шаблоне регулярного выражения должно быть неделимой лексемой и ничего не может находиться между"("
и"*"
, но вы разделили их.
- Двухсимвольная последовательность
Invalid quantifier in {,} in regex; marked by <– HERE in m/%s/
- Шаблон выглядит как квантор {min,max}, но min или max не могут быть распарсены как валидные числа: либо они имеют нули, стоящие в начале, либо представляют слишком большие числа, чтобы можно работать с ними. <– HERE показывает где в регулярном выражении найдена эта проблема. Смотрите perlre.
[‘%s’ is an unknown bound type in regex](https://metacpan.org/pod/perldiag#‘%s’ is an unknown bound type in regex; marked by <– HERE in m/%s/)
Вы использовали
\b{...}
или\B{...}
, но...
неизвестен Perl. Текущие допустимые варианты описаны в “, , , ” in perlrebackslash.Missing or undefined argument to require
- Вы пытались вызвать
require
без аргумента или с неопределённым значением в качестве аргумента.require
ожидает имя пакета или указание на файл в качестве аргумента. Смотрите “require” in perlfunc.
Раньше
require
без аргумента или сundef
предупреждала о пустом имени файла.- Вы пытались вызвать
Новые предупреждения
-
(D deprecated) Класс символов
/\C/
был объявлен устаревшим в v5.20 и теперь выводит предупреждение. Предполагается, что это станет ошибкой в v5.24. Этот класс символов совпадает с единичным байтом, даже если он появляется внутри многобайтовой последовательности, что нарушает инкапсуляцию и может повреждать UTF-8 строки. [“%s” is more clearly written simply as “%s” in regex; marked by <– HERE in m/%s/](https://metacpan.org/pod/perldiag#“%s” is more clearly written simply as “%s” in regex; marked by <– HERE in m/%s/)
(W regexp) (только при действии
use re 'strict'
или внутри(?[...])
).Вы указали символ, который имеет указанный более простой способ записи и который переносим между платформами, работающими с разными наборами символов.
[Argument “%s” treated as 0 in increment (++)](https://metacpan.org/pod/perldiag#Argument “%s” treated as 0 in increment (++))
(W numeric) Указанная строка была передана как аргумент оператору
++
, который ожидает либо число, либо строку, совпадающую с/^[a-zA-Z]*[0-9]*\z/
. Смотрите подробности в “Auto-increment and Auto-decrement” in perlop.Both or neither range ends should be Unicode in regex; marked by <– HERE in m/%s/
(W regexp) (только при действии
use re 'strict'
или внутри(?[...])
).В классе символов, обособленных скобками, в шаблоне регулярного выражения у вас используется диапазон, который имеет одну из границ, указанной с использованием
\N{}
, а другая граница указана с помощью непереносимого механизма. Perl рассматривает этот диапазон, как Юникод-диапазон, в котором все символы являются Юникод-символами и которые могут иметь различные кодовые значения на некоторых платформах, на которых работает Perl. Например,[\N{U+06}-\x08]
рассматривается как если бы написали[\N{U+06}-\N{U+08}]
, который совпадает с символами, чьи кодовые значения в Юникоде соответственно 6, 7 и 8. Но\x08
может означать что-то другое, поэтому выводится предупреждение.[Can’t do %s(“%s”) on non-UTF-8 locale; resolved to “%s”.](https://metacpan.org/pod/perldiag#Can’t do %s(“%s”) on non-UTF-8 locale; resolved to “%s”.)
(W locale) Вы 1) работаете при действии “
use locale
”; 2) текущая локаль не является UTF-8; 3) вы пытались сделать операцию изменения регистра на указанном Юникод символе; и 4) результат этой операции приведёт к смешиванию правил Юникода и локали, которые вероятно конфликтуют.-
(S experimental::const_attr) Атрибут
const
является экспериментальным. Если вы хотите использовать эту возможность, подавите предупреждения с помощьюno warnings 'experimental::const_attr'
, но имейте ввиду, что вы принимаете на себя риск, что ваш код может сломаться в будущих версиях Perl. -
(W overflow) вы вызвали
gmtime
с числом, которое невозможно обработать: слишком большое, слишком маленькое или NaN. Возвращаемое значение -undef
. Hexadecimal float: exponent overflow
(W overflow) Шестнадцатеричное значение с плавающей запятой имеет экспоненту бо́льше, чем поддерживается форматом плавающей запятой.
Hexadecimal float: exponent underflow
(W overflow) Шестнадцатеричное значение с плавающей запятой имеет экспоненту меньше, чем поддерживается форматом плавающей запятой.
Hexadecimal float: mantissa overflow
(W overflow) Шестнадцатеричное значение с плавающей запятой имеет больше бит в мантиссе (часть между
0x
и экспонентой, также известную как значащие цифры), чем поддерживается форматом плавающей запятой.Hexadecimal float: precision loss
(W overflow) Шестнадцатеричное значение с плавающей запятой имеет внутреннее представление с большим числом цифр, чем может быть выведено. Это может быть вызвано неподдерживаемым форматом long double или 64-битными целыми, которые недоступны (требуемые для получения цифр не некоторых конфигурациях).
[Locale ‘%s’ may not work well.%s](https://metacpan.org/pod/perldiag#Locale ‘%s’ may not work well.%s)
(W locale) Вы используется именованную локаль, которая не является UTF-8, которую Perl определил как не полностью совместимую с Perl. Второй
%s
указывает на причину.-
(W overflow) Вы вызвали
localtime
с числом, которое не может быть обработано: слишком большое, слишком маленькое или NaN. Возвращаемым значением являетсяundef
. Negative repeat count does nothing
(W numeric) Вы пытались выполнить оператор повторения
x
меньше чем 0 раз, что не имеет смысла.NO-BREAK SPACE in a charnames alias definition is deprecated
(D deprecated) Вы определили имя символа, содержащий неразрывный символ пробела. Замените его на обычный пробел. Обычно подобные имена определены в аргументе импорта
:alias
дляuse charnames
, но они могут быть определены переводчиком в$^H{charnames}
. Смотрите “CUSTOM ALIASES” in charnames.Non-finite repeat count does nothing
(W numeric) Вы попытались выполнить оператор повторения
x
Inf
(или-Inf
) раз, что не имеет смысла.[PerlIO layer ‘:win32’ is experimental](https://metacpan.org/pod/perldiag#PerlIO layer ‘:win32’ is experimental)
(S experimental::win32_perlio) Слой PerlIO
:win32
является экспериментальным. Если вы готовы принять риск его использования просто отключите предупреждение:no warnings "experimental::win32_perlio";
[Ranges of ASCII printables should be some subset of “0-9”, “A-Z”, or “a-z” in regex; marked by <– HERE in m/%s/](https://metacpan.org/pod/perldiag#Ranges of ASCII printables should be some subset of “0-9”, “A-Z”, or “a-z” in regex; marked by <– HERE in m/%s/)
(W regexp) (только при действии
use re 'strict'
или внутри(?[...])
).Строгие правила позволяют найти опечатки и другие ошибки. Возможно вы даже и не планировали использовать здесь диапазон, если под
"-"
понимался другой символ или он должен был быть экранирован ("\-"
). Если вы подразумевали диапазон, то то, что было использовано не является переносимым между ASCII и EBCDIC платформами и не имеют очевидного смысла для случайного читателя.[3-7] # OK; Очевидно и переносимо [d-g] # OK; Очевидно и переносимо [A-Y] # OK; Очевидно и переносимо [A-z] # Неправильно; Непереносимо; непонятно, что имелось ввиду [a-Z] # Неправильно; Непереносимо; непонятно, что имелось ввиду [%-.] # Неправильно; Непереносимо; непонятно, что имелось ввиду [\x41-Z] # Неправильно; Непереносимо; непонятно для не-гика
(Вы можете улучшить переносимость, указав Юникод-диапазон, что означает, что точки указываются с использованием
\N{...}
, но смысл может быть по-прежнему неочевиден. Строгие правила требуют, чтобы диапазоны, которые начинаются или заканчиваются ASCII символом, которые не являются контрольными, чтобы все крайние значения были литеральными символами, а не экранирующими последовательностями (как например,"\x41"
) и диапазоны должны состоять только из всех цифр, всех букв в верхнем регистре или всех букв в нижем регистре.Ranges of digits should be from the same group in regex; marked by <– HERE in m/%s/
(W regexp) (только при действии
use re 'strict'
или внутри(?[...])
)Строгие правила помогают найти опечатки или ошибки. Вы включили диапазон и одна из его границ является десятичной цифрой. При строгих правилах, когда такое происходит, обе границы должны быть цифрами в той же самой группе из 10 последовательных цифр.
-
(W redundant) Вы вызвали функцию с большим числом аргументов, чем требовалось, как показывает информация внутри других аргументов, которые вы передали (например, формат printf). На данный момент выводится, когда printf-подобный формат требует меньше аргументов, чем было передано, но может использоваться в будущем для, например,
. Категория предупреждений
redundant
(излишний) является новой. Смотрите также [perl #121025]. Replacement list is longer than search list
Это не новое диагностическое сообщение, но в ранних релизах оно не отображалось, если транслитерация содержала широкие символы. Теперь это исправлено, поэтому вы можете увидеть это сообщение в местах, в которых раньше вы его не видели (но должны были бы).
Use of for non-UTF-8 locale is wrong. Assuming a UTF-8 locale
(W locale) Вы используете регулярное выражение с правилами локали, произошло совпадение с Юникод-границей, при этом локаль не является Юникодной. Это не имеет смысла. Perl продолжит, подразумевая Юникод (UTF-8) локаль, но результаты могут быть некорректными за исключением если локаль оказалась ISO-8859-1 (Latin1), где это сообщение ложное и может быть проигнорировано.
Категория предупреждений
locale
является новой.[Using /u for ‘%s’ instead of /%s in regex; marked by <– HERE in m/%s/](https://metacpan.org/pod/perldiag#Using /u for ‘%s’ instead of /%s in regex; marked by <– HERE in m/%s/)
(W regexp) Вы использовали Юникод границу (
\b{...}
или\B{...}
) в части регулярного выражения, где действуют модификаторы/a
или/aa
. Эти два модификатора указывают на ASCII интерпретацию и это лишено смысла для Юникод определения. Сгенерированное регулярное выражение будет собрано так, что все границы будут использовать Юникод. Другие части регулярного выражения затронуты не будут.The bitwise feature is experimental
(S experimental::bitwise) Это предупреждение выводится, если вы использовали битовые операторы (
& | ^ ~ &. |. ^. ~.
) с включённой возможностью “bitwise”. Просто подавите это предупреждение, если вы хотите использовать эту возможность, но учтите, что в этом случае вы берёте на себя риск использования экспериментальной возможности, которая может измениться или быть удалённой в будущих версиях Perl:no warnings "experimental::bitwise"; use feature "bitwise"; $x |.= $y;
Unescaped left brace in regex is deprecated, passed through in regex; marked by <– HERE in m/%s/
(D deprecated, regexp) Вы использовали литеральный символ
"{"
в шаблоне регулярного выражения. Вы должны заменить его на"\{"
, поскольку в будущих версиях Perl (ориентировочно v5.26) это будет расцениваться как синтаксическая ошибка. Если разделитель шаблона также является фигурной скобкой, то любая совпадающая правая скобка ("}"
) также должна быть экранирована, чтобы не запутывать парсер, например:qr{abc\{def\}ghi}
Use of literal non-graphic characters in variable names is deprecated
(D deprecated) Использование литеральных неграфических символов (включая контрольные) в исходном коде для ссылки на ^FOO переменные, например
$^X
и${^GLOBAL_PHASE}
теперь считается устаревшим.Useless use of attribute “const”
(W misc) Атрибут
const
действует только на анонимные прототипы замыканий. Вы применил их к подпрограмме через attributes.pm. Это имеет смысл только внутри атрибутов анонимной подпрограммы.Useless use of /d modifier in transliteration operator
Это не новое диагностическое сообщение, но в ранних релизах оно не отображалось, если транслитерация содержала широкие символы. Теперь это исправлено, поэтому вы можете увидеть это сообщение в местах, в которых раньше вы его не видели (но должны были бы).
[“use re ‘strict’” is experimental](https://metacpan.org/pod/perldiag#“use re ‘strict’” is experimental)
(S experimental::re_strict) Отличия в поведении, когда шаблон регулярных выражений компилируется при действии
'strict'
, могут меняться в будущих релизах Perl несовместимом образом; есть также предложения изменить способ включения строгой проверки вместо использования субпрагмы. Это означает, что шаблон, который компилируется сегодня, не будет компилироваться в будущих версиях Perl. Это предупреждение сигнализирует вам об этом риске.Warning: unable to close filehandle properly: %s
Warning: unable to close filehandle %s properly: %s
(S io) Раньше Perl молча игнорировал любые ошибки, когда делал неявное закрытие файлового дескриптора, то есть там, где счётчик ссылок файлового дескриптора достигал нуля и код пользователя ещё не вызывал
close()
; например:{ open my $fh, '>', $file or die "open: '$file': $!\n"; print $fh, $data or die; } # здесь неявное закрытие
В ситуациях, когда диск полон, из-за буферизации, ошибка могла быть обнаружена только во время финального закрытия, таким образом, отсутствие проверки результатов закрытия может быть опасно.
Теперь Perl предупреждает о подобных ситуациях.
-
(W locale) При использовании однобайтовойлокали (то есть, не UTF-8), был обнаружен многобайтовый символ. Perl рассматривает этот символ, как указанная кодовая точка Юникод. Комбинация не-UTF-8 локалей и Юникода опасна. Почти наверняка некоторые символы будут иметь разное представление. Например, в локали ISO 8859-7 (Греческая), кодовая точка 0xC3 представляет заглавную гамму. Но тем же самым является 0x393. Это делает сравнение строк ненадёжным.
Вы должны найти как этот многобайтовый символ смешался с вашей однобайтной локалью (возможно вы думали, что у вас UTF-8 локаль, но Perl с этим не согласился).
Категория предупреждений
locale
является новой.
Изменения в существующей диагностике
<> должны быть кавычки
Это предупреждение изменилось на <> at require-statement should be quotes, чтобы сделать сообщение более идентичным.
[Argument “%s” isn’t numeric%s](https://metacpan.org/pod/perldiag#Argument “%s” isn’t numeric%s)
В записи perldiag для этого предупреждения было внесено пояснение:
Обратите внимание, что для Inf и NaN (бесконечность и не-число) опередление "числовой" нечто необычное; строка сами по себе (например, "Inf") рассматриваются как числовые, а всё, что следует за нами рассматривается как нечисловое значение.
[Global symbol “%s” requires explicit package name](https://metacpan.org/pod/perldiag#Global symbol “%s” requires explicit package name (did you forget to declare “my %s”?))
К этому сообщению было добавлено ‘(did you forget to declare “my %s”?)’ (не забыли ли вы сделать объявление “my %s”?), чтобы сделать его более полезным для начинающих Perl программистов. [perl #121638]
- Сообщение ‘переменная “my” &foo::bar не может быть в пакете’ было переработано, используя слово ‘подпрограмма" вместо ’переменная’.
\N{}
in character class restricted to one character in regex; marked by <– HERE in m/%s/В этом сообщении character class (класс символа) был изменён на inverted character class or as a range end-point is (инвертированный символьный класс или как граница диапазона), чтобы отметить улучшение в
qr/[\N{named sequence}]/
(смотрите в “Selected Bug Fixes”).-
К этому сообщению было добавлено ‘:
%f
’, чтобы показать виновное число с плавающей запятой. - Possible precedence problem on bitwise %c operator перефразировано Possible precedence problem on bitwise %s operator.
Unsuccessful %s on filename containing newline
Это предупреждение теперь выводится, только если есть перевод строки в конце имени файла.
- “Variable
%s
will not stay shared” (переменная%s
перестанет быть разделённой) было изменено, чтобы сказать “Subroutine” (подпрограмма), когда используется лексическая подпрограмма, которая перестанет быть разделённой. Variable length lookbehind not implemented in regex m/%s/
Запись в perldiag для этого предупреждения имеет информацию о добавленном поведении Юникода.
Удалённые диагностические сообщения
“Ambiguous use of -foo resolved as -&foo()”
Здесь нет никакой неопределённости и это мешает использовать отрицательные значения констант, например,
-Inf
.“Constant is not a FOO reference”
Было удалено разыменование констант (например,
my_constant->()
) во время компиляции, поскольку не учитывалась возможная перегрузка. [perl #69456] [perl #122607]
Изменения в утилитах
Удаление find2perl
, s2p
и a2p
Директория
x2p/
была удалена из базового Perl.Это привело к удалению find2perl, s2p и a2p. Они все выпущены на CPAN как отдельные дистрибутивы (
App::find2perl
,App::s2p
,App::a2p
).
h2ph
h2ph
теперь поддерживает шестнадцатеричные константы в предопределённых компилятором макро-определениях, как видимые в$Config{cppsymbols}
. [perl #123784].
encguess
- Больше не зависит от не базовых модулей.
Конфигурация и компиляция
Configure
теперь проверяет наличиеlrintl()
,lroundl()
,llrintl()
иllroundl()
.Configure
с-Dmksymlinks
теперь должен быть быстрее. [perl #122002].- Библиотеки
pthreads
иcl
будут слинкованы, если присутствуют при сборке. Это позволит XS модулям, которым требуются треды для работы на perl без поддержки тредов. Обратите внимание, что вам по-прежнему требуется передавать аргумент-Dusethreads
, если требуется поддержка тредов в perl. - Для long double (чтобы получить больше точности и диапазона чисел с плавающей запятой) можно использовать библиотеку GCC quadmath, которая реализует четырёхкратную точность чисел с плавающей запятой на платформах x86 и IA-64. Смотрите подробности в
INSTALL
. - MurmurHash64A и MurmurHash64B могут быть сконфигурированы как внутренняя хеш-функция.
make test.valgrind
теперь поддерживает параллельное тестирование.Например:
TEST_JOBS=9 make test.valgrind
Смотрите подробности в “valgrind” in perlhacktips.
Опция сборки MAD (различные украшения атрибутов) была удалена
Это ныне не поддерживаемая попытка сохранения распарсеного дерева Perl более точным, чтобы была возможность сделать автоматическую конверсию Perl 5 в Perl 6 более простой.
Эта опция конфигурации не сопровождается уже много лет и вероятно уже серьёзно отклонилась от актуальности с обеих сторон: как Perl 5, так и Perl 6.
- Доступен новый флаг компиляции
-DPERL_OP_PARENT
. Больше информации в дискуссии выше в “Internal Changes”. Pathtools больше не пытаются загрузить XS на miniperl. Это значительно ускоряет сборку perl.
Тестирование
- Был добавлен
t/porting/re_context.t
для проверки, что utf8 и его зависимости являются только подмножество переменных захвата$1..$n
, которые зашиты вPerl_save_re_context()
для локализации, поскольку в этой функции нет эффективной возможности во время исполнения определить какие переменные локализованы. - Тесты на производительность были добавлены в файл
t/perf/taint.t
. - Некоторые тесты регулярных выражений написаны так, что они будут работать очень медленно, если какие-то определённые оптимизации окажутся сломанными. Эти тесты были перенесены в новые файлы
t/re/speed.t
иt/re/speed_thr.t
, и они запускаются с использованиемwatchdog()
. test.pl
теперь разрешаетplan skip_all => $reason
, чтобы сделать его более совместимым сTest::More
.- Был добавлен новый тестовый скрипт
op/infnan.t
для тестирования, что бесконечность и не-числа работают корректно. Смотрите “Infinity and NaN (not-a-number) handling improved”.
Поддержка платформ
Восстановленные платформы
Платформы IRIX и Tru64 снова работают.
Остаются несколько ошибок во время
make test
: [perl #123977] и [perl #125298] для IRIX; [perl #124212], [cpan #99605], и [cpan #104836 для Tru64.Работа z/OS с кодовой страницей 1047 EBCDIC
Базовый perl теперь работает на этой EBCDIC платформе. Ранние версии также работали, но несмотря на то, что официально поддержка не была отозвана, последние версии Perl не компилировались и не работали нормально. Perl 5.20 в целом работал, но имел множество багов, который теперь были исправлены. Множество CPAN модулей, которые поставляются с Perl по-прежнему не проходят тесты, включая и
Pod::Simple
. Однако версияPod::Simple
на CPAN должна работать: она была исправлено слишком поздно для включения в Perl 5.22. Ведётся работа по исправлению множества по-прежнему сломанных CPAN модулей, которая появится на CPAN, как только она будет завершена. Поэтому вам не придётся ждать Perl 5.24, чтобы получить работающие версии.
Платформы, для которых прекращена поддержка
NeXTSTEP/OPENSTEP
NeXTSTEP была проприетарной платформой, которая поставлялась с рабочими станциями NeXT в ранние 90-е; OPENSTEP была спецификацией API, которая предоставляла NeXTSTEP-подобное окружение для не-NeXTSTEP систем. Обе уже долгое время мертвы, поэтому поддержка сборки Perl на них была удалена.
Платформо-специфичные заметки
EBCDIC
Требуется специальная обработка для perl интерпретатора на EBCDIC платформах, чтобы
qr/[i-j]/
совпадало только с"i"
и"j"
, поскольку существует 7 символов между кодовыми точками"i"
и"j"
. Эта специальная обработка срабатывала только для диапазона, обе границы которого являлись литералами. Теперь это также срабатывает для любых форм\N{...}
, указывающих символ по имени кодовой точки Юникод вместо литерала. Смотрите “Character Ranges” in perlrecharclass.HP-UX
archname теперь отличает use64bitint от use64bitall.
Android
Поддержка сборки была улучшена для кросс-компиляции в целом и в частности для Android.
- VMS
- При создании субпроцесса без ожидания возвращаемое значение теперь корректное значение PID.
- Исправлен прототип, поэтому линковка не ломается при использовании компилятора C++ VMS.
- Определение
finite
,finitel
иisfinite
было добавлено вconfigure.com
, поддержка окружения имеет небольшие изменения и исправления для проверки статуса устаревших возможностей.
- Win32
miniperl.exe
теперь собирается с-fno-strict-aliasing
, позволяя 64-битным сборкам завершаться на GCC 4.8. [perl #123976]nmake minitest
теперь работает на Win32. Из-за проблем с зависимостями вам необходимо сначала выполнитьnmake test-prep
и некоторое небольшое число тестов упадёт. [perl #123394]- Perl теперь может быть собран с C++ режиме на Windows установкой макроса мэйкфайла
USE_CPLUSPLUS
в значение “define”. - Списочная форма открытия канала была реализована для Win32. Обратите внимание: вместо
system LIST
это больше не откатывается на шелл. [perl #121159] - Новые опции конфигурации
DebugSymbols
иDebugFull
были добавлены к мейкфайлам Windows. - Ранее сборка XS модулей (включая модули со CPAN) с использованием Visual C++ для Win64 приводило к большому числу предупреждений на каждый фал из
hv_func.h
. Эти предупреждения были заглушены. - Поддержка сборки без PerlIO была удалена из мэйкфайлов Windows. Не-PerlIO сборки считаются устаревшими, начиная с Perl 5.18.0 и уже не поддерживаются в
Configure
на POSIX системах. - От 2 до 6 миллисекунд и семь I/O вызовов было сохранено на каждую попытку открыть perl модуль для каждого путя в
@INC
. - Сборка с Intel C теперь всегда проходит с установленной опцией C99.
%I64d
теперь используется вместо%lld
для MinGW.- Был исправлен крах в
open
в экспериментальном слое:win32
. Также открытие/dev/null
(которое работало по умолчанию в:unix
слое в Перле Win32) было реализовано для:win32
. [perl #122224] - Была добавлена новая опция мэйкфайла
USE_LONG_DOUBLE
в dmake мэйкфайле Windows только для сборки в gcc. Установите её в значение “define”, если вы хотите, чтобы perl использовал long double для большей точности и расширенного диапазона чисел с плавающей запятой.
OpenBSD
На OpenBSD, Perl по умолчанию используется системный
malloc
, чтобы задействовать возможности безопасности, которые он предоставляет. Собственная обёртка malloc использовалась, начиная с v5.14 по соображениям производительности, но OpenBSD проект верит, что безопасность стоит того и считает, чтобы пользователи, которым нужна скорость специально потребуют этого. [perl #122000].- Solaris
- Мы ищем компилятор Sun Studio в двух местах:
/opt/solstudio*
и/opt/solarisstudio*
. - Сборки на Solaris 10 с опцией
-Dusedtrace
сразу упадут, так как make проигнорирует предполагаемую зависимость для сборкиperldtrace.h
. Добавлена явная зависимость вdepend
. [perl #120120] - Опции C99 были удалены; поиск как
solstudio
, так иSUNWspro
; а также была добавлена поддержка нативногоsetenv
.
- Мы ищем компилятор Sun Studio в двух местах:
Внутренние изменения
Была добавлена экспериментальная поддержка разрешить операциям в дереве опреаций на ходить своих родителей, если они есть. Это включается с помощью опции сборки
-DPERL_OP_PARENT
. Рассматривается возможность, что когда-нибудь это станет опцией, включённой по умолчанию, таким образом XS код, который напрямую запрашивает полеop_sibling
должен быть обновлён, чтобы работать нормально в будущем.На сборках с
PERL_OP_PARENT
полеop_sibling
было переименовано вop_sibparent
и был добавлен новый флагop_moresib
. На последней операции в цепи потомковop_moresib
является ложью, аop_sibparent
указывает на родителя (если есть), а не равенNULL
.Чтобы существующий код прозрачно работал с использованием
PERL_OP_PARENT
или без, было добавлено несколько новых макросов и функций, которые должны использоваться, вместо того, чтобы напрямую манипулировать сop_sibling
.Для случая, когда требуется прочесть
op_sibling
, только чтобы определить следующего потомка, были добавлены два макроса. Для простого сканирования через цепь потомков:for (; kid->op_sibling; kid = kid->op_sibling) { ... }
теперь должно быть написано так:
for (; OpHAS_SIBLING(kid); kid = OpSIBLING(kid)) { ... }
Для дополнения дерева операций была добавлена общая функция
op_sibling_splice()
, которая позволяет манипулировать с цепью операций-потомков. По аналогии с Perl функциейsplice()
она позволяет удалить одну или больше операций из цепи потомков и заменить их нулём или несколькими новыми операциями. Она прозрачно поддерживает все изменения в потомков, родителей и op_last указателей и прочего.Если требуется манипулировать с операциями на низком уровне, то есть три новых макроса
OpMORESIB_set
,OpLASTSIB_set
иOpMAYBESIB_set
, которые предназначены для низкоуровневой переносимой установкиop_sibling
/op_sibparent
, а также обновленияop_moresib
. Первый устанавливает указатель потомка на нового потомка, второй устанавливает операцию последним потомком, а третий по условию выполняет первое или второе действие. Обратите внимание, что в отличии отop_sibling_splice()
эти макросы не поддерживают согласованное состояние родителя в то же самое время (то есть обновлениеop_first
иop_last
, когда это необходимо).Были добавлены функция C-уровня
Perl_op_parent()
и метод Perl-уровняB::OP::parent()
. C-функция существует только в сборках сPERL_OP_PARENT
(её использование на ванильных сборках это ошибка во время компиляции).B::OP::parent()
присутствует всегда, но на ванильных сборках он всегда возвращаетNULL
. При наличииPERL_OP_PARENT
они вернут родителя текущей операции, если она есть. Переменная$B::OP::does_parent
позволяет вам определить поддерживает лиB
получение предка операции.PERL_OP_PARENT
была добавлена в 5.21.2, но интерфейс изменился значительно в 5.21.11. Если вы обновили ваш код до изменений в 5.21.11, потребуется дальнейшая переработка. Основные изменения после 5.21.2:- Макросы
OP_SIBLING
иOP_HAS_SIBLING
были переименованы вOpSIBLING
иOpHAS_SIBLING
для согласованности с другими макросам манипулирующими с операциями. - Поле
op_lastsib
было переименовано вop_moresib
и его значение было инвертировано. - Макрос
OpSIBLING_set
был удалён и был заменён наOpMORESIB_set
. - Функция
op_sibling_splice()
теперь поддерживает нулевой аргументparent
, при котором срез не затрагивает первую и последнюю операции в цепи потомков.
- Макросы
- Был создан макрос, чтобы позволить XS коду лучше манипулировать с POSIX категорией локали
LC_NUMERIC
. Смотрите “Locale-related functions and macros” in perlapi. - Функция полной замены
atoi
grok_atou
теперь замещенаgrok_atoUV
. Смотрите подробности в perlclib. - Была добавлена новая функция
Perl_sv_get_backrefs()
, которая позволяет получать слабые ссылки, если они доступны, которые указывают на SV. - Функция
screaminstr()
была удалена. Несмотря на то, что она отмечена как публичная, она не была задокументирована и не использовалась в модулях на CPAN. Вызов функции вызывал фатальную ошибку, начиная с 5.17.0. - Функции
newDEFSVOP()
,block_start()
,block_end()
иintro_my()
были добавлены в API. - Внутренняя функция
convert
вop.c
была переименована вop_convert_list
и добавлена в API. - Функция
sv_magic()
больше не запрещает “ext” магию на доступных только для чтения значениях. В конце концов perl не может узнать будет ли заданная магия модифицировать SV или нет. [perl #123103]. Доступ к “CvPADLIST” in perlapi в XSUB теперь запрещён.
Поле
CvPADLIST
было задействовано для других внутренних целей для XSUB. Поэтому, в частности, вы больше не можете рассчитывать, что он имеет значение NULL, для проверки является ли CV XSUB. Используйте вместо этогоCvISXSUB()
.- SV типа
SVt_NV
теперь иногда не имеют тела, если конфигурация и платформа поддерживают это: особенно, когдаsizeof(NV) <= sizeof(IV)
. “Безтелесность” означает, то NV значение сохраняется непосредственно в заголовке SV без необходимости выделения отдельного тела. Этот трюк уже использовался для IV, начиная с 5.9.2 (хотя в случае IV, это использовалось всегда, независимо от платформы и сборочной конфигурации). - Переменные
$DB::single
,$DB::signal
и$DB::trace
теперь для set- и get-магии хранят свои значения как IV, и эти IV используются, когда тестируются их значения вpp_dbstate()
. Это предотвращает бесконечную рекурсию в perl, если перегруженный объект присваивается к любой из этих переменных. [perl #122445]. Perl_tmps_grow()
, который был отмечен, как публичное API, но не документирован, был удалён из публичного API. Это изменение не затрагивает XS-код, который использует макросEXTEND_MORTAL
для предрасширения mortal стека.- Внутренности Perl больше не устанавливают и не используют флаг
SVs_PADMY
.SvPADMY()
теперь возвращает истинное значение для всего, что не отмеченоPADTMP
, аSVs_PADMY
теперь определено как 0. - Макросы
SETsv
иSETsvUN
были удалены. Они больше не используется в базовом Perl, начиная с коммита 6f1401dc2a пять лет назад, и не были обнаружены на CPAN. - Бит
SvFAKE
(неиспользуемый на HV) неофициально зарезервирован Дэвидом Митчеллом для будущей работы над vtables. - Функция
sv_catpvn_flags()
принимает флагиSV_CATBYTES
иSV_CATUTF8
, которые указывают, что добавляемая строка является байтами или UTF-8 соответственно. (Эти флаги присутствуют начиная с 5.16.0, но раньше не упоминались как часть API.) Был представлен новый класс опкодов
METHOP
. Он хранит информацию, используемую во время исполнения для улучшения производительности вызовов методов класса/объекта.OP_METHOD
иOP_METHOD_NAMED
были изменены изUNOP/SVOP
вMETHOP
.cv_name()
это новая функция API, которой может быть передан CV или GV. Она возвращает SV, содержащий имя подпрограммы, для использования в диагностике.cv_set_call_checker_flags()
это новая функция API, которая работает какcv_set_call_checker()
, но в отличии от неё позволяет вызывающему указать требует ли проверщик вызова полного GV для вывода имени подпрограммы, или вместо него может быть передан CV. Какое бы значение не было передано оно будет приемлемо дляcv_name()
.cv_set_call_checker()
гарантирует, что это будет GV, но ему может потребоваться создать его на лету, что неэффективно. [perl #116735]CvGV
(который не является частью API) теперь более сложный макрос, который может функции и создавать GV. Для тех случаев, когда он используется как логическое значение, добавляетсяCvHASGV
, который вернёт истину для CV, которое номинально имеет GV, но без создания самого GV.CvGV
также теперь возвращает GV для лексических подпрограмм. [perl #120441]- Функция “sync_locale” in perlapi была добавлена в публичное API. Нужно избегать изменений локали программы из XS кода. Однако это требуется некоторым не-Перл библиотекам, вызываемым из XS, как например
Gtk
. Когда это происходит, Перлу необходимо сообщить о том, что локаль была изменена. Используйте эту функцию, чтобы сделать это, до того как вернуть управление Перл. - Определения и метки для флагов в поле
op_private
операций теперь автогенерируются из данных вregen/op_private
. Эффект от этого можно заметить в том, что вывод некоторых флаговConcise
может немного отличаться а вывод флаговperl -Dx
может отличаться значительно (они оба используют сейчас тот же набор меток). Также, сборки с отладочной информацией теперь имеют несколько новых assert’ов вop_free()
, чтобы быть уверенным, что операции не имеют неопознанных флагов, установленных вop_private
. - Устаревшая переменная
PL_sv_objcount
была удалена. - Perl теперь пытается сохранить категорию локали
LC_NUMERIC
установленной в “C” за исключением операций, которым требуется установить её для заданной локали программы. Это защищает множество XS модулей, которые не могут справиться с ситуацией, когда разделитель целой и дробной части не является точкой. До этого релиза Perl устанавливал эту категорию в “C”, но вызовPOSIX::setlocale()
менял её. Теперь подобный вызов изменит локаль категорииLC_NUMERIC
для программы, но локаль сообщаемая XS коду останется в значении “C”. Есть новые макросы для манипуляции с локалью LC_NUMERIC, включаяSTORE_LC_NUMERIC_SET_TO_NEEDED
иSTORE_LC_NUMERIC_FORCE_TO_UNDERLYING
. Смотрите “Locale-related functions and macros” in perlapi. - Был написан новый макрос
isUTF8_CHAR
, который эффективно определяет является ли строка, переданная параметром, начинается с правильно сформированным кодированным в UTF-8 символом. В следующих функциях приватного API удалён параметр контекста:
Perl_cast_ulong
,Perl_cast_i32
,Perl_cast_iv
,Perl_cast_uv
,Perl_cv_const_sv
,Perl_mg_find
,Perl_mg_findext
,Perl_mg_magical
,Perl_mini_mktime
,Perl_my_dirfd
,Perl_sv_backoff
,Perl_utf8_hop
.Обратите внимание, что версии этих функций без префикса, которые являются частью публичного API, такие как
cast_i32()
, остались неизменными.- Типы
PADNAME
иPADNAMELIST
теперь раздельные типы и больше не могут быть просто приравнены к SV и AV. [perl #123223]. - Имена pad теперь всегда в UTF-8. Макрос
PadnameUTF8
всегда возвращает истину. Ранее это уже было так, но поддержка для двух различных типов внутреннего представления имён pad была удалена. - Был добавлен новый класс операций
UNOP_AUX
. Это субклассUNOP
с добавлением поляop_aux
, который указывает на массив объединений UV, SV* и т.д. Он предназначен для случая, когда операции требуется сохранить больше данных, чем простоop_sv
или подобное. На данный момент единственная подобная операция этого типа этоOP_MULTIDEREF
(смотрите следующий пункт). Была добавлена новая операция
OP_MULTIDEREF
, которая производит один или несколько поисков во вложенных массивах или хешах, где ключ является константой иди простой переменной. Например, выражение$a[0]{$k}[$i]
, которая ранее включало десять операцийrv2Xv
,Xelem
,gvsv
иconst
, теперь выполняется за одну операциюmultideref
. Это также работает дляlocal
,exists
иdelete
. Сложные выражения для индекса, такие как[$i+1]
по-прежнему выполняются с использованиемaelem
/helem
, а просмотр одноуровнего массива с небольшим индексом-константой по-прежнему выполняется с использованиемaelemfast
.
Избранные исправления ошибок
close
теперь устанавливает$!
Когда происходит ошибка ввода/вывода, факт подобной ошибки сохранялся в дескриптор.
close
возвращает ложь для подобных дескрипторов. Ранее значение$!
оставлялосьclose
нетронутым, поэтому общепринятый подход записиclose $fh or die $!
не работал полноценно. Теперь дескриптор сохраняет также и значение$!
, аclose
его восстанавливает.no re
теперь делает больше и лексическиРаньше использование
no re
отключало лишь несколько опций. Теперь оно полностью отключает все включённые опции. Например, раньше вы не могли отключить отладку после её включения в том же самом блоке.pack("D", $x)
иpack("F", $x)
теперь обнуляют заполнение на x86 сборках с long double. При некоторых сборочных опциях на GCC 4.8 и старше они перезаписывали обнулённое заполнение или целиком игнорировали инициализированный буфер. Это приводило к ошибкам вop/pack.t
[perl #123971]- Расширение массива, клонированного из потока родителя могло привести к ошибке “Предпринята попытка модификации значения доступного только на чтение”, при попытке модифицировать новые элементы. [perl #124127]
- Ошибка предположения и последующий крах в выражении
*x=<y>
была исправлена. [perl #123790] - Ошибка возможного краха/зацикливания, связанная с компиляцией лексических подпрограмм, была исправлена. [perl #124099]
- UTF-8 теперь работает корректно в именах функции, в нецитированных ограничителях встроенных документов, а также в именах переменных, используемых как индексы массива. [perl #124113]
- Повторяемый глобальный шаблон в скалярном контексте на крупных связанных строках выполнял поиск соответствия с экспоненциальным замедлением, в зависимости от текущей позиции в строке. [perl #123202]
- Были исправлены различные крахи, из-за того, что парсер смущали синтаксические ошибки. [perl #123801] [perl #123802] [perl #123955] [perl #123995]
- Был исправлен
split
в области лексической$_
не падать из-за нарушения предположения. [perl #123763] - Синтаксис
my $x : attr
внутри различных списочных операторов больше не приводит к падению из-за нарушения предположения. [perl #123817] - Знак
@
в кавычках с последующей не-ASCII цифрой (что не является корректным идентификатором) приводил парсер к краху вместо того, чтобы просто попытаться использования@
как литерал. Это было исправлено. [perl #123963] *bar::=*foo::=*glob_with_hash
падали, начиная с Perl 5.14, но больше не делают этого. [perl #123847]foreach
в скалярном контексте не размещал элемент на стеке, приводя к ошибкам. (print 4, scalar do { foreach(@x){} } + 1
напечатает 5.) Это было исправлено и возвращаетundef
. [perl #124004]- Было исправлено несколько случаев, когда данные, хранившие значения переменных окружения в базовом C коде, могли потенциально быть переписаны. [perl #123748]
- Некоторые шаблоны, начинающиеся с
/.*..../
при поиске совпадения в длинных строках были медленными, начиная с v5.8, а некоторые формы/.*..../i
замедлились, начиная с v5.18. Теперь они снова быстрые. [perl #123743]. - Оригинальное видимое значение
$/
сохраняется, когда устанавливается в некорректное значение. Раньше, например, если вы устанавливали$/
в ссылку на массив, то Perl выводил ошибку исполнения и не устанавливалPL_rs
, и код, который проверял$/
видел ссылку на массив. [perl #123218]. - В шаблонах регулярных выражений, POSIX класс, как например
[:ascii:]
, должен быть внутри класса символов, заключённый в скобки, как напримерqr/[[:ascii:]]/
. Теперь выводится предупреждение, когда что-то напоминающее POSIX класс находится не внутри класса, заключённого в скобки. Это предупреждение не выводилось, если было отрицание POSIX класса:[:^ascii:]
. Теперь это исправлено. - В Perl 5.14.0 появился баг, когда
eval { LABEL: }
приводил к краху. Это было исправлено. [perl #123652]. - Были исправлены различные крахи, из-за того, что парсер смущали синтаксические ошибки. [perl #123617]. [perl #123737]. [perl #123753]. [perl #123677].
- Код, как например
/$a[/
, раньше читал следующую строку ввода и рассматривал её как если бы она шла сразу после открытой скобки. Некоторый некорректный код мог парситься и выполняться, но некоторый код приводил к краху, поэтому это теперь запрещено. [perl #123712]. - Исправлено переполнение аргумента для
pack
. [perl #123874]. - Исправлена обработка не строгого
\x{}
. Теперь\x{}
является эквивалентом для\x{0}
вместо того, чтобы падать. stat -t
больше не считается стекируемым, также как и-t stat
. [perl #123816].- Следующее выражение больше не приводит к SEGV:
qr{x+(y(?0))*}
. - Исправлен бесконечный цикл в разборе обратных ссылок в регулярных выражениях.
- Несколько небольших исправлений ошибок в поведении Infinity и NaN, включая предупреждения, когда производится приведение к числу строк, содержащих Infinity и NaN. Например, “NaNcy” больше приводится к NaN.
- Исправлена ошибка в шаблонах регулярных выражений, которая могла привести к сегфолту и другим крахам. Это происходит только в шаблонах, скомпилированных с
/i
, принимающих во внимание текущую POSIX локаль (что обычно означает, что они скомпилированы в области действияuse locale
), и это должна быть строка с по крайне мере 128 последовательными совпадающими байтами. [perl #123539]. s///g
теперь работает на очень больших строках (где больше 2 миллиардов итераций), вместо вылета с сообщением ‘Зацикливание замены’. [perl #103260]. [perl #123071].gmtime
больше не падает на значениях NaN. [perl #123495].\()
(ссылка на пустой список) иy///
с лексической$_
в текущей области видимости может выполнять запись и в начало, и в конец стека. Теперь это исправлено и предварительно расширяет стек.prototype()
без аргументов раньше читал предыдущий элемент на стеке, поэтомуprint "foo", prototype()
выводило прототип foo. Это было исправлено и вместо этого использует$_
.- Некоторые случаи, когда лексические state подпрограммы объявлены внутри предекларированных подпрограммах, приводили к краху. Например, при выполнении eval строки, включающей имя внешней переменной. Теперь такого не происходит.
- Некоторые случаи вложенных лексических подпрограмм внутри анонимных подпрограмм могли вызывать ошибку ‘Bizarre copy’ или возможно даже падать.
- При попытке выдать предупреждения, perl отладчик по умолчанию (
perl5db.pl
) иногда возвращал ‘Undefined subroutine &DB::db_warn called’. Эта ошибка, которая стала происходить в Perl 5.18, теперь была исправлена. [perl #123553]. - Некоторые синтаксические ошибки в заменах, таких как
s/${<>{})//
, приводили к краху начиная с Perl 5.10. (В некоторых случаях крах не происходил до версии 5.16). Крах, естественно, был исправлен. [perl #123542]. - Исправлено несколько переполнений при увеличении длины строки, в частности, выражение повтора, как например,
33 x ~3
, приводило к крупному переполнению буфера, так как размер нового буфера вывода неправильно обрабатывался вSvGROW()
. Выражения, наподобие этого теперь корректно сигнализируют о панике при выделении памяти. [perl #123554]. formline("@...", "a");
приводит к краху. СлучайFF_CHECKNL
вpp_formline()
не устанавливает указатель, который отмечал позицию среза, что приводило к тому, что случайFF_MORE
приводил к краху в нарушением сегментации. Это было исправлено. [perl #123538].- Было исправлено возможное переполнение буфера и крах при разборе литерального шаблона при компиляции регулярного выражения. [perl #123604].
fchmod()
иfutimes()
теперь устанавливают$!
, когда у них происходит ошибка, при передаче закрытого файлового дескриптора. [perl #122703].op_free()
иscalarvoid()
больше не падают из-за переполнения стека при освобождении глубокого рекурсивного дерева операций. [perl #108276].- В Perl 5.20.0, в
$^N
стал отключаться UTF-8 флаг, если к нему получали доступ из кодового блока внутри регулярного выражения, кодируя значение в UTF-8. Это было исправлено. [perl #123135]. - Завершившийся ошибкой вызов
semctl
больше не переписывает существующие элементы на стеке, что означает, что(semctl(-1,0,0,0))[0]
больше не выдаёт предупреждение о “неициализированности”. else{foo()}
без пробела передfoo
теперь устанавливает правильный номер строки для этого выражения. [perl #122695].- Иногда присвоение в
@array = split
оптимизируется так, чтоsplit
пишет непосредственно в массив. Это приводило к ошибкам, нарушавшим возможность использовать это выражение для lvalue контекста. Поэтому(@a=split//,"foo")=bar()
приводило к ошибке. (Эта ошибка появилась вероятно в Perl 3, Когда эта оптимизация была добавлена). Теперь это было исправлено. [perl #123057]. - Когда список аргументов проваливает проверку, заданную сигнатурой функции (которая по-прежнему экспериментальная возможность), результирующее сообщение об ошибке теперь даёт имя файла и номер строки вызывающей стороны, а не вызванной подпрограммы. [perl #121374].
- Флип-флоп операторы (
..
и...
в скалярном контексте) раньше поддерживали отдельное состояние для каждого рекурсивного уровня (число раз, когда внешняя подпрограмма вызывалась рекурсивно), вопреки документации. Теперь каждое замыкание имеет внутреннее состояния для каждого флип-флопа. [perl #122829]. - Флип-флоп оператор (
..
в скалярном контексте) возвращал один и тот же скаляр каждый раз, пока окружающая подпрограмма вызывалась рекурсивно. Теперь он всегда возвращает новый скаляр. [perl #122829]. use
,no
, метки оператора, специальные блоки (BEGIN
) и pod теперь всегда разрешены, как первая часть вmap
илиgrep
блоках, блоках послеprint
илиsay
(или других функций) возвращающих хендл, и внутри${...}
,@{...}
и подобных. [perl #122782].- Оператор повтора
x
теперь распространяет lvalue контекст на свои аргументы с левой стороны, когда используется в контекстах, наподобиеforeach
. Это позволяетfor(($#that_array)x2) { ... }
ожидаемо работать, если цикл модифицирует$_
. (...) x ...
в скалярном контексте раньше портило стек, если на один из операндов действовала перегрузка “x”, вызывая ошибочное поведение. [perl #121827].- Присвоение к лексическому скаляру часто оптимизируется; например, в
my $x; $x = $y + $z
оператор присвоения удаляется и оператор сложения пишет непосредственно в$x
. Различные ошибки, связанные с этой оптимизацией были исправлены. Некоторые операторы на правой стороне иногда вообще не могут выполнить присвоение или присваивают неверное значение, или вызывают STORE дважды или вообще не разу на связанных переменных. Затронутыми операторами были$foo++
,$foo--
и-$foo
при действииuse integer
,chomp
,chr
andsetpgrp
. - Списочные присвоения иногда приводили к ошибкам, если тот же скаляр оказывался на обоих сторонах присвоения из-за использования
tied
,values
илиeach
. Результатом становилось присвоение ошибочного значения. setpgrp($nonzero)
(с одним аргументом) по ошибке был изменён в 5.16 и стал значитьsetpgrp(0)
. Это было исправлено.__SUB__
возвращало ошибочное значение или портило память при работе в отладчике (опция-d
) и в подпрограммах, содержащихeval $string
.- Когда
sub () { $var }
становилась встраиваемой, то она теперь возвращает каждый раз разный скаляр, также как и невстраиваемая, хотя Perl по-прежнему оптимизирует копию в случаях, если это не имеет никакой заметной разницы. my sub f () { $var }
иsub () : attr { $var }
больше не подлежат встраиванию. Первый приведёт к краху; последний просто выкинет атрибут. Исключение делается лишь для малоизвестного атрибута:method
, который не делает ничего особенного.Встраивание подпрограмм с пустым прототипом теперь более последовательное, чем раньше. Раньше подпрограмма с множеством операторов, из которых все кроме последнего оптимизировались, могла встраиваться, только если это была анонимная подпрограмма, содержащая строковый
eval
, или объявлениеstate
, или замыкание внешней лексической переменной (или любой анонимной подпрограммой при работе отладчика). Теперь любая подпрограмма, которая приводится к простой константе после оптимизации операторов подлежит встраиванию. Это применяется для вещей наподобиеsub () { jabber() if DEBUG; 42 }
.Некоторые подпрограммы с явным
return
делались встраиваемыми, вопреки документации. Теперьreturn
всегда предотвращает встраивание.- На некоторых системах, таких как VMS,
crypt
может вернуть не-ASCII строку. Если скаляр, которому идёт присвоение, содержал до этого UTF-8 строку, тоcrypt
не будет убирать UTF-8 флаг, таким образом искажая возвращаемое значение. Это происходило с$lexical = crypt ...
. crypt
больше не вызываетFETCH
дважды на связанном первом аргументе.- Незавершённый встроенный документ на последней строке оператора цитирования (
qq[${ <<END }]
,/(?{ <<END })/
) больше не приводит к двойному освобождению памяти. Этот дефект появился в 5.18. index()
иrindex()
больше не приводят к краху, когда используются на строках размером больше, чем 2 Гбайта. [perl #121562].- Небольшая умышленная утечка памяти в
PERL_SYS_INIT
/PERL_SYS_INIT3
на сборках Win32 была исправлена. Это может затронуть встраиваемые сборки, которые регулярно создают и разрушают движок perl внутри одного процесса. POSIX::localeconv()
теперь возвращает данные для текущей локали программы даже если вызывается вне области действияuse locale
.POSIX::localeconv()
теперь корректно работает на платформах, которые не имеютLC_NUMERIC
и/илиLC_MONETARY
, или на которых Perl был скомпилирован игнорировать обе или какую-либо одну из этих категорий локали. В подобных случаях в хеше, возвращаемомlocaleconv()
нет полей для соответствующих значений.POSIX::localeconv()
теперь маркирует соответственно возвращаемые значения как UTF-8 или нет. Ранее они всегда возвращались как байты, даже если должны были кодироваться как UTF-8.- На Microsoft Windows внутри области видимости
use locale
следующие POSIX классы символов возвращают результаты для множества локалей, которые не соответствуют POSIX стандарту:[[:alnum:]]
,[[:alpha:]]
,[[:blank:]]
,[[:digit:]]
,[[:graph:]]
,[[:lower:]]
,[[:print:]]
,[[:punct:]]
,[[:upper:]]
,[[:word:]]
, и[[:xdigit:]]
. Так происходило из-за того, что сама реализация Microsoft не следовала стандарту. Perl теперь принимает специальные меры, чтобы скорректировать это. - Множество проблем было обнаружено и исправлено сканером Coverity.
system()
и друзья должны теперь работать правильно на Android сборках.По недосмотру, значение, указанное в
-Dtargetsh
дляConfigure
, игнорировалось в части сборочного процесса. В итоге кросскомпилируемый perl для Android оказывался с дефектной версиейsystem()
,exec()
и обратных кавычек: команды искали/bin/sh
, вместо/system/bin/sh
, что приводило к ошибке для большинства устройств, устанавливая$!
в значениеENOENT
.qr(...\(...\)...)
,qr[...\[...\]...]
, иqr{...\{...\}...}
теперь работают. Ранее было невозможно экранировать эти три левых символа с обратной косой чертой внутри шаблона регулярного выражения, где иначе они рассматривались как метасимволы, открывающий шаблон разделитель являлся тем символом, а закрывающий разделитель являлся его зеркальным отображением.s///e
на заражённых UTF-8 строках портилиpos()
. Эта ошибка появилась в 5.20 и теперь исправлена. [perl #122148].- Не-граница слова в регулярных выражениях (
\B
) не всегда совпадала с концом строки; в частности,q{} =~ /\B/
не совпадало. Эта ошибка появилась в 5.14 и теперь исправлена. [perl #122090]. " P" =~ /(?=.*P)P/
должно совпадать, но не совпадало. Теперь это исправлено. [perl #122171].- Ошибка компиляции
use Foo
вeval
могло привести к ложному определению подпрограммыBEGIN
, которое выводило предупреждение “Subroutine BEGIN redefined” на следующее использованиеuse
или другого блокаBEGIN
. [perl #122107]. - Синтаксис
method { BLOCK } ARGS
теперь корректно разбирает аргументы, если они начинаются с открывающей скобки. [perl #46947]. - Внешние библиотеки и Perl могут по разному воспринимать, что такое локаль. Это становится проблемой, при разборе строки версии, если разделитель цифр локали изменился. Разбор версии был исправлен, чтобы убедиться, что он обрабатывает локаль корректно. [perl #121930].
- Была исправлена ошибка, когда ошибка предположения на нулевую длину и кодовый блок внутри регулярного выражения, приводили к тому, что
pos
видел некорректное значение. [perl #122460]. - Разыменование константы теперь работает корректно для тайпглоб констант. Ранее глоб приводился к строковой форме и извлекалось его имя. Теперь используется сам глоб. [perl #69456]
- При разборе сигила (
$
@
%
&
) с последующей фигурной скобкой, парсер больше не пытается угадать является ли это блоком или конструктором хеша (вызывая позже синтаксическую ошибку при таком предположении), так как дальше может идти только блок. undef $reference
теперь освобождает ссылку немедленно, вместо того, чтобы ждать следующего выражения. [perl #122556]- Различные случаи, когда имя подпрограммы используется (автозагрузка, перегрузка, сообщения об ошибках), раньше приводило к краху для лексической подпрограммы. Теперь это было исправлено.
- Поиск bareword теперь пытается избежать создания пакетов, если окажется, что bareword это не имя подпрограммы.
- Компиляция анонимных констант (например,
sub () { 3 }
) теперь не удаляет подпрограмму с именем__ANON__
в текущем пакете. Удалялось не только*__ANON__{CODE}
, но также возникала утечка памяти. Этот баг появился в Perl 5.8.0. - Объявление заглушки, наподобие
sub f;
иsub f ();
больше не удаляло константу с тем же именем, определённую с помощьюuse constant
. Этот баг появился в Perl 5.10.0. qr/[\N{named sequence}]/
теперь работает правильно в большинстве случаев.Некоторые имена, известные в
\N{...}
ссылаются на последовательность из нескольких символов, вместо обычного единственного символа. Классы символов, заключённые в скобки обычно совпадают с одни символом, но теперь появилась специальная поддержка, которая позволяет им совпадать с именованной последовательностью, но не в случае, если класс инвертирован или последовательность указана в начале или конце диапазона. В этих случаях изменение поведения от изначального это несколько переработанное сообщение о фатальной ошибке, выводимое если класс является частью конструкции?[...])
. Когда[...]
находится в одиночестве, возникает такое же нефатальное предупреждение, как и раньше, и используется только первый символ последовательности, также как и раньше.- Заражённые константы, которые вычисляются во время компиляции больше не приводят к тому, что не относящиеся выражения также становились заражёнными. [perl #122669]
open $$fh, ...
, который создавал хендл с именем наподобие"main::_GEN_0"
, не давал хендлу правильный счётчик ссылок, поэтому могло происходить двойное освобождение памяти.- При решении является ли bareword именем метода, парсер мог быть запутан, если
our
подпрограмма с тем же именем существует и пытается найти метод в пакетеour
подпрограммы, вместо пакета вызывающего. - Парсер больше не путается при указании
\U=
внутри строки в двойных кавычках. Раньше это приводило к синтаксической ошибке, но теперь компилируется корректно. [perl #80368] - Всегда подразумевалось, что файловые тестовые операторы
-B
и-T
рассматривали кодированные в UTF-8 файлы как текст. (perlfunc был обновлён, чтобы уточнить это). Раньше, существовала возможность, что некоторые файлы рассматривались как UTF-8 но на деле они не были валидным UTF-8. Теперь это исправлено. Операторы теперь работают и на EBCDIC платформах. - При некоторых условиях предупреждение возникающее при компиляции шаблона регулярного выражения выводилось несколько раз. Теперь это было исправлено.
- В Perl 5.20.0 появилась регрессия, при которой кодированный в UTF-8 шаблон регулярного выражения, который содержал одиночные ASCII буквы в нижнем регистре не совпадал с такой же буквой в верхнем регистре. Это было исправлено в 5.20.1 и 5.22.0. [perl #122655]
- Развёртка константы может подавить предупреждения, если не действуют лексические предупреждения (
use warnings
илиno warnings
) и$^W
была ложью при компиляции, но стала истиной во время исполнения. - Загрузка таблиц Юникода при поиске совпадения в регулярном выражении вызывала ошибки предположения в сборках с отладочной информацией, если предыдущий поиск совпадения был в таком же регулярном выражении. [perl #122747]
- Клонирование треда раньше работало некорректно для лексических подпрограмм, возможно вызывая крах или двойное освобождение при выходе.
- Начиная с Perl 5.14.0, удаление
$SomePackage::{__ANON__}
и затем присвоение значения undef анонимной подпрограмме приводило к внутреннему искажению данных, приводящему к краху Devel::Peek или выводу бессмысленных данных в B.pm. Это было исправлено. (caller $n)[3]
теперь выдаёт имя лексической подпрограммы, вместо выдачи значения"(unknown)"
.sort subname LIST
теперь поддерживает использование лексических подпрограмм как подпрограмм сравнения.- Создание псевдонимов (например, через
*x = *y
) может смутить списочное присвоение, где указываются два имени для одной и той же переменной на каждой стороне, приводя к присвоению некорректных значений. [perl #15667] - Длинные ограничители встроенных документов вызывают ошибки чтения на коротких строках ввода. Это было исправлено. Сомнительно, что может возникнуть какой-либо крах. Этот баг относится ко времени, когда только появилсь встроенные документы в Perl 3.000 двадцать пять лет назад.
- Оптимизация в
split
, которая рассматривалаsplit /^/
, какsplit /^/m
имела побочный эффект, когдаsplit /\A/
также рассматривался какsplit /^/m
, чего не должно было происходить. Это было исправлено. (Однако надо заметить, чтоsplit /^x/
не вёл себя какsplit /^x/m
, что также рассматривается как баг и будет исправлен в будущей версии). [perl #122761] - Малоизвестный синтаксис
my Class $var
(смотрите fields и attributes) мог быть сбит с толку в области действияuse utf8
еслиClass
был константой, чьё значение содержит Latin-1 символы. - Блокировка и разблокировка значений через Hash::Util или
Internals::SvREADONLY
больше не имеет никакого эффекта на значения, которые были доступны только на чтение с самого начала. Ранее разблокировка таких значений приводила к краху, зависаниям и другому некорректному поведению. - Некоторые нетерминированные
(?(...)...)
конструкции в регулярных выражениях могут вызывать крах или выдавать неправильные сообщения об ошибках./(?(1)/
является одним из таких примеров. pack "w", $tied
больше не вызывает FETCH дважды.- Списочное присвоение как например,
($x, $z) = (1, $y)
теперь корректно работает если$x
и$y
созданные алиасы вforeach
. - Некоторые шаблоны, включающие кодовые блоки с синтаксическими ошибками, как например
/ (?{(^{})/
, могут зависать или падать с ошибками на сборках с отладочной информацией. Теперь они выводят ошибки. - Ошибка предположения, при разборе
sort
с включённой отладочной информацией, была исправлена. [perl #122771]. *a = *b; @a = split //, $b[1]
может вызвать некорректное чтение и вывести мусорный результат.- В выражении
() = @array = split
,() =
в начале больше не смущает оптимизатор в предположении, что лимит 1. - Фатальное предупреждение больше не предотвращает вывод синтаксических ошибок. [perl #122966].
- Исправлена ошибка NaN double в long-double конвертирование на VMS. Для чистых NaN (и только на Itanium, не Alpha) выводилась отрицательная бесконечность вместо Nan.
- Исправлена ошибка, которая приводила к тому, что
make distclean
ошибочно оставлял некоторые файлы. [perl #122820]. - AIX теперь устанавливает длину корректно в
getsockopt
. [perl #120835]. [cpan #91183]. [cpan #85570]. - Фаза оптимизации при компиляции регулярного выражения может работать вечно и израсходовать всю память при некоторых условиях. Теперь исправлено. [perl #122283].
- Тестовый скрипт
t/op/crypt.t
теперь использует SHA-256 алгоритм, если алгоритм по умолчанию отключён, вместо ошибки. [perl #121591]. - Исправлена ошибка на единицу при установке размера разделяемого массива. [perl #122950].
Исправлена ошибка, которая могла привести ко входу perl в бесконечный цикл при компиляции. В частности,
while(1)
внутри субсписка, напримерsub foo { () = ($a, my $b, ($c, do { while(1) {} })) }
Этот баг появился в 5.20.0 [perl #122995].
- На Win32, если переменная была локализована в псевдопроцессе, который позже производит fork, восстановление оригинального значения в потомке псевдо-процесса вызывает порчу памяти и крах в потомке псевдо-процесса (и соответственно в процессе ОС). [perl #40565].
- Вызов
write
на формате с полем^**
может вызвать панику вsv_chop()
, если не ыбло достаточно аргументов или если переменная, используемая для заполнения поля была пустой. [perl #123245]. - Не-ASCII лексическая подпрограмма теперь появляется без завершающего мусора, если она показывается в сообщении об ошибке.
- Прототип подпрограммы
\@
больше не выравнивает заключённые в скобки массивы (взятие ссылки на каждый элемент), но берёт ссылку на сам массив. [perl #47363]. - Блок, не содержащий ничего, вместо цикла
for
в C-стиле, вызывает повреждение стека, приводя список вне блока к потере элементов или перезаписи элементов. Это могло происходить вmap { for(...){...} } ...
и в списках, содержащихdo { for(...){...} }
. [perl #123286]. scalar()
теперь распространяет lvalue контекст, поэтомуfor(scalar($#foo)) { ... }
может модифицировать$#foo
через$_
.qr/@array(?{block})/
больше не умирает с сообщением “Bizarre copy of ARRAY”. [perl #123344].eval '$variable'
во вложенных именованных подпрограммах может иногда искать глобальную переменную даже при наличии лексической переменной в области видимости.- В Perl 5.20.0,
sort CORE::fake
, где ‘fake’ это что-угодно кроме ключевого слова, стало удалять последние 6 символов и рассматривать результаты, как имя подпрограммы сортировки. Предыдущее поведение, восприятияCORE::fake
, как имени подпрограммы сортировки было восстановлено. [perl #123410]. - Вне
use utf8
односимвольная Latin-1 лексическая переменная запрещена. Сообщение об ошибке для этого случая “Can’t use global$foo
…”, выдавало мусор, вместо имени переменной. readline
на несуществующем хендле приводил к тому, что${^LAST_FH}
выдавал ссылку на неопределённый скаляр (или падал из-за ошибки предположения). Теперь${^LAST_FH}
неопределён.(...) x ...
в пустом контексте теперь применяет скалярный контекст к аргументу с левой стороны, вместо контекста, в котором вызвана текущая подпрограмма. [perl #123020].
Известные проблемы
pack
значения NaN в perl, скомпилированным в Visual C 6 происходит неправильно, приводя к ошибкам в тестеt/op/infnan.t
. [perl 125203]- Преимущество Perl в способности быть собранным для работы правильно на любой версии Юникода. Однако в Perl 5.22 самая ранняя такая версия Юникода это 5.1 (текущая версия 7.0).
- Платформы EBCDIC
cmp
(и соответственноsort
) операторы не всегда дают корректный результат, когда оба операнда UTF-EBCDIC кодированные строки и есть смесь ASCII и/или контрольных символов вместе с другими символами.- Диапазоны, содержащие
\N{...}
вtr///
(иy///
) операторах транслитерации рассматриваются по-разному, чем в эквивалентном диапазоне в шаблоне регулярного выражения. Они должны, но не вызывают рассмотрение всех значений в диапазонах ни как Юникод кодовые точки, и ни как нативные. (“Version 8 Regular Expressions” in perlre даёт представление о том, как это должно работать). - Encode и кодирование в большинстве случаев сломаны.
- Многие CPAN модули, которые поставляются с базовым Perl демонстрируют падающие тесты.
pack
/unpack
с форматом"U0"
может не работать правильно.
- Известно, что следующие модули имеют ошибки в тестах с этой версией Perl. Во многих случаях патчи были отправлены, поэтому надеемся, что вскоре последуют новые релизы:
- B::Generate версии 1.50
- B::Utils версии 0.25
- Coro версии 6.42
- Dancer версии 1.3130
- Data::Alias версии 1.18
- Data::Dump::Streamer версии 2.38
- Data::Util версии 0.63
- Devel::Spy версии 0.07
- invoker версии 0.34
- Lexical::Var версии 0.009
- LWP::ConsoleLogger версии 0.000018
- Mason версии 2.22
- NgxQueue версии 0.02
- Padre версии 1.00
- Parse::Keyword версии 0.08
Некролог
Брайн МакКоули умер 8 мая 2015. Он часто писал в Usenet, Perl Monks и другие Perl форумы, и отправил несколько CPAN дистрибутивов под ником NOBULL, а также внёс вклад в Perl FAQ. Он участвовал практически в каждой YAPC::Europe и помогал организовать YAPC::Europe 2006 и QA Хакатон 2009. Его сообразительность и радость работы с запутанными системами особенно проявлялись в его любви к настольным играм; многие Perl-монгеры помнят как играли во Fluxx и другие игры вместе с Брайном. Его будет не хватать.
Благодарности
Perl 5.22.0 представляет собой примерно 12 месяцев разработки, начиная с Perl 5.20.0 и содержит примерно 590,000 строк изменений в 2,400 файлах от 94 авторов.
Исключая автогенерируемые файлы, документацию и утилиты релиза, было сделано примерно 370,000 строк изменений в 1,500 .pm, .t, .c и .h файлах.
Perl продолжает бурно развиваться в своей третьей декаде благодаря активному сообществу пользователей и разработчиков. Известно, что следующие люди содействовали в улучшении того, что стало Perl 5.22.0:
Aaron Crane, Abhijit Menon-Sen, Abigail, Alberto Simões, Alex Solovey, Alex Vandiver, Alexandr Ciornii, Alexandre (Midnite) Jousset, Andreas König, Andreas Voegele, Andrew Fresh, Andy Dougherty, Anthony Heading, Aristotle Pagaltzis, brian d foy, Brian Fraser, Chad Granum, Chris ‘BinGOs’ Williams, Craig A. Berry, Dagfinn Ilmari Mannsåker, Daniel Dragan, Darin McBride, Dave Rolsky, David Golden, David Mitchell, David Wheeler, Dmitri Tikhonov, Doug Bell, E. Choroba, Ed J, Eric Herman, Father Chrysostomos, George Greer, Glenn D. Golden, Graham Knop, H.Merijn Brand, Herbert Breunung, Hugo van der Sanden, James E Keenan, James McCoy, James Raspass, Jan Dubois, Jarkko Hietaniemi, Jasmine Ngan, Jerry D. Hedden, Jim Cromie, John Goodyear, kafka, Karen Etheridge, Karl Williamson, Kent Fredric, kmx, Lajos Veres, Leon Timmermans, Lukas Mai, Mathieu Arnold, Matthew Horsfall, Max Maischein, Michael Bunk, Nicholas Clark, Niels Thykier, Niko Tyni, Norman Koch, Olivier Mengué, Peter John Acklam, Peter Martini, Petr Písař, Philippe Bruhat (BooK), Pierre Bogossian, Rafael Garcia-Suarez, Randy Stauner, Reini Urban, Ricardo Signes, Rob Hoelz, Rostislav Skudnov, Sawyer X, Shirakata Kentaro, Shlomi Fish, Sisyphus, Slaven Rezic, Smylers, Steffen Müller, Steve Hay, Sullivan Beck, syber, Tadeusz Sośnierz, Thomas Sibley, Todd Rinaldo, Tony Cook, Vincent Pit, Vladimir Marek, Yaroslav Kuzmin, Yves Orton, Ævar Arnfjörð Bjarmason.
Список выше конечно неполон, так как был автоматически сгенерирован из истории системы контроля версий. В частности, он не включает имена (очень высоко ценимых) помощников, которые сообщали о проблемах в Perl баг-трекер.
Множество изменений, включённых в этой версии, идут от CPAN модулей, включённых в ядро Perl. Мы благодарны всему CPAN сообществу за помощь в развитии Perl.
Полный список всех принимавших участие в разработке в истории Perl смотрите пожалуйста в файле AUTHORS
в дистрибутиве исходного кода Perl.
Сообщения об ошибках
Если вы найдёте то, что как вы считаете является ошибкой, вы можете проверить ранее опубликованные статьи в новостной группе comp.lang.perl.misc и базе ошибок perl на http://rt.perl.org/perlbug/. Также может быть информация на http://www.perl.org/, домашней странице Perl.
Если вы уверены, что у вас ещё ни кем не сообщённая ошибка, пожалуйста запустите программу perlbug, включённую в ваш релиз. Убедитесь, что вы привели максимально краткий, но достаточный пример, для воспроизведения проблемы. Ваш отчёт по ошибке, вместе с выводом perl -V
, будет отправлен на адрес perlbug@perl.org для анализа командой портирования Perl.
Если ошибка, о котором вы сообщаете, имеет отношение к безопасности, что делает его неуместным для отправки в публичную архивируемую почтовую рассылку, пожалуйста отправьте его на perl5-security-report@perl.org. Это неархивируемая почтовая рассылка с закрытой подпиской, которая включает всех главных коммитеров, и позволит скоординировать выпуск патча для смягчения или исправления проблемы на всех платформах, на которых поддерживается Perl. Пожалуйста используйте этот адрес только для проблем безопасности в базовом Perl, а не для модулей, которые распространяются на CPAN.
Смотрите также
Файл Changes
для просмотра исчерпывающей информации о том, что изменилось.
Файл INSTALL
о том, как собирать Perl.
Файл README
для общей информации.
Файлы Artistic
и Copying
для информации по правам.
■ Владимир Леттиев (перев.)
← Что нового в Perl 5.22 | Содержание | Обзор CPAN за май 2015 г. →