Данный пост является вырезкой из документа perl5100delta .
Упаковка UTF-8 строк
Изменена семантика pack()
и unpack()
относительно данных в кодировке
UTF-8. Теперь по умолчанию строка обрабатывается посимвольно, а не побайтно, как было раньше.
Примечательно, что код, который использовал такие выражения как
pack("a*", $string
для определения кодированной строки, теперь получит
неизменнную строку $string. Вы можете включить старое поведение
этих функций используя use bytes
.
Для совместимости с pack(), C0
в unpack() шаблонах указывает на то, что
данные должны быть обработаны в посимвольном режиме, т.е символ за символом, в
противоположность ему, U0
в unpack() определяет UTF-8 режим, в
котором упакованная строка обрабатывается в его UTF-8-закодированной форме
на основе побайтовой обработки строк. Это обеспечивает обратную совместимость с perl 5.8.X, а теперь
совместим так же между pack() и unpack().
Кроме того, C0
и U0
могут быть так же использованы в шаблонах pack() для
указания соответственно посимвольного и побайтного режимов.
C0
и U0
в середине шаблона формата в pack и unpack теперь переключаются на
указанный режим кодирования, соблюдая группировку круглых скобок. Ранее,
круглые скобки игнорировались.
Также добавился еще один формат для функции pack() - W
предназначен
для замены старого формата C
. C
содержит unsigned символы, закодированные
как байты в строке во внутреннем представлении. W
представляет
значения символов без знака(логичные)(анг. unsigned(logical) character),
код которых может быть больше 255. Поэтому он более
надежен при работе с данными потенциально закодированными в кодировке UTF-8
( в то время как C
упаковывает значения выходящие за пределы диапазона 0..255, не соблюдая
кодировку строки).
На практике, это значит, что форматы в pack() теперь нейтральны к кодировке,
за исключением C
.
Для надежности, формат A
в unpack() теперь удаляет все концевые пробелы Unicode.
До perl 5.9.2, формат использовался для снятия только обычных ASCII пробельных символов.
Особенности подсчета байтов/символов в unpack()
Новый шаблон символов в unpack() - "."
, возвращает количество байтов или
символов в строке(в зависимости от выбранного режима кодирования, см. выше).
Удалены переменные $*
и $#
Удалена переменная $*
, которая ранее была объявлена устаревшей в пользу
модификаторов /s
и /m
регулярных выражений.
Удалена переменная $#
(выходной формат для чисел).
Добавлено два серьёзных диагностических сообщения - $# is no longer supported
,
$* is no longer supported
,
которые срабатывают при попытке использования соответствующих переменных $#
и $*
.
Левые значения substr() больше не имеют фиксированной ширины
Левые значения возвращались в форме трех аргументов substr(), используемых для "фиксированной ширины окна"(анг."fixed length window") в исходной строке. В некоторых случаях это могло приводить к непредсказуемым результатам. Теперь ширина окна настраивается самостоятельно на длину строки ей соответствующей.
Распознавание -f _
Идентификатор _
в настоящее время воспринимается как 'голое слово' после оператора
тестирования файла. Это решает ряд вопросов ошибочного анализа кода, когда определена
глобальная подпрограмма с именем _
.
:unique
Атрибут :unique
не производит никакой операции, поспольку его реализация
имела фундаментальные недостатки и проблемы с потокобезопасностью.
Эффекты прагм в eval()
Значение времени компиляции(compile-time value) внутренней вспомогательной переменной %^H
теперь определяется и в коде, скомпилированном в eval("")
. Это делает
его полезным для выполнения лексических прагм.
В качестве побочного эффекта переменной %^H
- константы перегрузки теперь
действуют внутри eval("").
chdir FOO
Когда в функцию chdir()
передается голое слово(bareword), оно
воспринимается как дескриптор файла. В ранних релизах perl голое слово в chdir
интерпретировалось как имя каталога.(Gisle Aas)