March 2010 Archives

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

UNIVERSAL::DOES()

В классе UNIVERSAL появился новый метод DOES(). Он был добавлен для решения семантической проблемы с методом isa(). isa() проверяет наследование, тогда как DOES() разработан для его замещения, что позволяет авторам модулей использовать другие типы отношений между классами (в добавок к наследованию). (chromatic)

Подробнее об этом в разделе Метод "$obj->DOES( ROLE )" в классе UNIVERSAL.

Форматы

Форматы улучшены несколькими способами. Новый тип поля - ^* может быть использован для каждой строки текста переменной ширины. Нулевые символы в строке шаблона обрабатываются корректно. Совместное использование @# и ~~ вместе будет приводить к возникновению ошибки времени компиляции, так как указанные форматы полей несовместимы. Расширен документ perlform, исправлены различные недоработки.

Модификаторы pack() и unpack()

Два новых модификатора порядка байтов, >-(тупоконечный(big-endian) модификатор) и < - ("остроконечный"(little-endian) модификатор), которые могут быть использованы в шаблонах pack() и unpack() для принудительного определения порядка байтов. См. "pack" in perlfunc и perlpacktut.

no VERSION

Теперь можно использовать no с указанием номера версии perl, что будет означать, что можно использовать старшие версии perl.

    use 5.10.0; # выполняемая версия perl не ниже 5.10.0
    no 5.10.0;  # разрешено выполнение на perl старше 5.10.0

chdir, chmod и chown для дескрипторов файлов

chdir, chmod и chown можно использовать с дескрипторами файлов так же как и с именами файлов, если система поддерживает соответственно fchdir, fchmod и fchown. Эта возможность включена благодаря патчу, предоставленному Gigle Aas.

Группы процессов в ОС

$( и $) теперь возвращают группы процессов в том порядке, в котором их возвращает операционная система. Эта стало возможным благодаря Gigle Aas.

Рекурсия в sort()

Вы теперь можете использовать рекурсивный вызов подпрограмм в функции sort(), благодаря Robin Houston.

Исключения в свертывании констант

Процедура свертывания констант теперь завернута в обработчике исключений, и если свертывание констант вызывает исключительную ситуацию (например в результате попытки деления на ноль), perl сохраняет текущий опкод , а не прерывает всю программу. (Nicholas Clark, Dave Mitchell)

Фильтры исходного кода в @INC

Это реализовано для совершенствования механизма подпрограмм-обработчиков в @INC, добавлением фильтра исходного кода в начале открытого дескриптора возвращаемого обработчиком.

    push @INC, \&my_sub;

    sub my_sub {
       my ($coderef, $filename) = @_; # $coderef is \&my_sub
       ...
    }

Эта особенность планировалось давно, и оно до сих пор не полностью реализовано. См. "require" in perlfunc (Nicholas Clark)

Новые внутренние переменные

  • ${^RE_DEBUG_FLAGS}

    Эта переменная контролирует, чтобы флаги отладки были в силе для машины регулярных выражений во время исполнения при использовании use re "debug". См. re.

  • ${^CHILD_ERROR_NATIVE}

    Эта переменная сохраняет неизменный статус возвращенный последним закрытым каналом, оператором ввода команд (``), успешного вызова wait() или waitpid(), или функции system(). См. perlrun. (Предоставил Gisle Aas)

  • ${^RE_TRIE_MAXBUF}

    См. Оптимизация чередования строк .

  • ${^WIN32_SLOPPY_STAT}

    См. Функция стат в Windows .

Разное

unpack() теперь по умолчанию распаковывает содержимое переменной $_.

mkdir() без агрументов по умолчанию работает с $_.

Внутренний дамп вывода был усовершенствован, так что непечатаемые символы такие как символ новой строки "\n" и символ забоя(backspace) "\b" выводятся в в нотации \x, вместо восьмеричного числа.

Опция -C больше не может использоваться в строке #!. Она там не воспринимается в любом случае, посколько стандартные потоки уже настроены на точку исполнения perl интерпретатора. Вместо этого вы можете использовать binmode() чтобы получить желаемое поведение.

UCD 5.0.0

Копия Базы Символов Юникода(Unicode Character Database) которая включена в поставку perl 5, обновлена до версии 5.0.0.

MAD

MAD, расшифровывается как Miscellaneous Attribute Decoration (примерный перевод на русский - Различные обозначения атрибутов. MAD пока в развитии, Perl 5 к Perl 6. Чтобы его включить, необходимо передать аргумент -Dmad при конфигурировании и сборке perl. Но это повлияет на скорость работы perl; причем он проходит не все тесты из тестового набора. (Larry Wall, Nicholas Clark).

kill() в Windows

На платформе Windows, kill(-9, $pid) теперь убивает дерево процессов. (На UNIX, он доставляет сигнал всем процессам указаной группы процессов.

perl5100delta (3)
категория: perl5100delta

Частичный перевод документа perl5100delta.

readdir() в системе Windows

Функция readdir() может возвращать "короткое имя" когда полное имя содержит символы, не принадлежащие кодовой таблице ANSI (ANSI codepage). Аналогично Cwd::cwd() может возвращать короткое имя директории, а glob() может возвращать короткие имена файлов и директорий. В файловой системе NTFS эти короткие имена всегда могут быть представлены в кодовой таблице ANSI. Это не будет верно для всех остальных драйверов файловых систем (file system drivers); например файловая система FAT хранит короткие имена в кодовой таблице OEM, так некоторые файлы на томах FAT остаются недоступными через ANSI API.

Кроме того, $^X, @INC, и $ENV{PATH} обрабатываются препроцессором при запуске, чтобы проверить все пути на валидность в кодовой таблице ANSI (если это возможно)

Функция Win32::GetLongPathName() теперь возвращает UTF-8 закодированное корректное имя файла вместо использования замены символов для того, чтобы подогнать имя к кодовой таблице ANSI. Новая функция Win32::GetLongPathName() может быть использована для преобразования полного имени файла в короткое, только если полное имя не пожет быть представлено в кодовой таблице ANSI.

Многие другие функции в модуле Win32 были усовершенствованы для обработки UTF-8 закодированных аргументов. Более подробно об этом в Win32.

Переопределение readpipe()

Встроенная функция readpipe() теперь может быть переопределена. Это позволяет переопределить ее аналог - оператор qx// (также известный, как оператор `` ). Кроме того, теперь по умолчанию исползуется $_ , если не предоставлено никаких аргументов.(Rafael Garcia-Suarez)

Аргумент по умолчанию для readline()

Теперь readline() по умолчанию использует *ARGV если ему не перадано аргументов. (Rafael Garcia-Suarez)

Переменные класса 'state'

Введен новый класс переменных. Переменные состояния (state variables) подобны лексическим переменным, но декларированные ключевым словом state вместо my. Они видны только в своей лексической области, но их значения стойкие: в отличие от лексических переменных, они не становятся неопределенными при выходе из их области видимости, но сохраняют свое прежнее значение. (Rafael Garcia-Suarez, Nicholas Clark)

Для использования 'state' переменных, нужно предварительно объявить:

    use feature 'state';

или используя ключ командной строки -E .

Операторы тестирования стека

В качестве новой формы синтаксического сахара теперь доступны операторы тестирования стека. Вы можете теперь писать f -w -x $file в ряд, что тоже самое -x $file && -w _ && -f _ . Подробнее в "-X" in perlfunc

Statistic

About this Archive

This page is an archive of entries from March 2010 listed from newest to oldest.

February 2010 is the previous archive.

August 2010 is the next archive.

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