perl5100delta - Несовместимые изменения (1)

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

Statistic

About this Entry

This page contains a single entry by Dinar published on March 31, 2010 1:32 AM.

perl5100delta(4) - DOES(), pack, unpack, разное was the previous entry in this blog.

О Perl 6. is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.