Данный пост является вырезкой из документа 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)