Recently in perl5100delta Category

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

Новая прагма mro

Добавлена новая прагма, mro ( для порядка разрешения метода(Method Resolution Order )). Это позволяет переключаться на базовый класс (per-class basis), алгоритм, который perl использует для поиска унаследованных методов в иерархии множественного наследования. По умолчанию MRO не изменен ( Поиск в глубину (DFS, Depth First Search ). Другой MRO имеется в наличии: C3 алгоритм. Смотрите mro для получения более подробной информации (Brandon Black)

Отметим, что в связи с изменениями в осуществлении поиска иерархии класса, код, который используется для присвоения *ISA неопределенного значения скорее всего будет прерван. Во всяком случае, присвоение неопределенного значения *ISA имел побочный эффект удаления магического массива @ISA а это не должно было происходить. Также, кэш *::ISA::CACHE:: больше не существует, чтобы заставить сбросить кэш @ISA, теперь нужно использовать mro API, или же просто осуществить присвоение массиву @ISA (например @ISA = @ISA ).

  • Рекурсивные шаблоны

    Добавлена конструкция (?PARNO) для составления рекурсивных структур регексов.

    Каждый захват скобок может теперь рассматриваться как независимый шаблон, который может быть введен с использованием синтаксиса (?PARNO) (где PARNO - номер захватывающего буфера). Например, следующий шаблон будет сопоставлен вложенным сбалансированным угловым скобкам.

       "text.. <a  <b> > .. text.. " =~ /(
              <(?:
                (?>[^<>]+)
                |
                (?1)   # возврат к началу первой 
                          # захватывающей скобке 
            )*>
        )/x
      and print $1; # выводит <a  <b> >;
     

    Я пока данную возможность на практике не использовал, если у вас имеются более показательные примеры реализации рекурсивных структур с использованием (?PARNO) поделитесь с народом в комментарии к этому посту, если не жалко.

  • Именованные захватывающие скобки

    Теперь в шаблоне можно именовать захватывающие скобки и обращаться к их содержимому по имени. Синтаксис именования (?<NAME>....). Это позволяет ссылаться к именованным буферам используя синтаксис \k<NAME> . В шаблоне, новые магические хэши %+ и %- могут быть использованы для доступа к содержимому буферу захвата.

    Простой пример удаления дублирующих симвовов с использованием именованных захватывающих скобок:

       my $word = "aab";
      # удалить дублирующие символы
      $word =~ s/(?<letter>.)\k<letter>/$+{letter}/g; 
      print $word; # выводит "ab"
     

    В %+ и %- сохраняются именованные буферы захвата:

       'foo' =~ /(?<named_buffer>foo)/;
    
    
      # теперь  в %+ и %- содержится следующее
      %- =( 'named_buffer' => 'foo');
      %- =( 'named_buffer' => [ 'foo' ] );
     

    %+ и %- реализуются как связанные хэши с помощью стандартного модуля Tie::Hash::NamedCapture.

       --- неясности с переводом --- 
      здесь содержится то, что я не смог перевести, надеюсь на 
      отзывчивость perlhack`еров
      -----------------------------
    
    
      --- EN --- 
      Users exposed to the .NET regex engine will find that
      the perl implementation differs in that the numerical
      ordering of the buffers is sequential, and not "unnamed
      first, then named". Thus in the pattern
      --- RU --- 
      Пользователи, использующие регулярную машину .NET
      найдут, что perl реализация буферов в что числовое
      упорядочивание буферов является последовательным, и не
      "названный первым, который тогда назван".  Таким образом
      шаблон
    
         /(A)(?<B>B)(C)(?<D>D)/
    
      --- EN --- 
      $1 will be 'A', $2 will be 'B', $3 will be 'C' and $4
      will be 'D' and not $1 is 'A', $2 is 'C' and $3 is 'B'
      and $4 is 'D' that a .NET programmer would expect. This
      is considered a feature. :-)
      (Yves Orton)
      --- RU --- 
      $1 будет содержать 'A', $2 будет содержать 'B', $3 будет
      содержать 'C' и $4 будет 'D', что .NET программист будет
      ожидать. Это продуманная функция :) 
      (Yves Orton)
    
      ---/ неясности с переводом --- 
  • Сверхжадные квантификаторы

    Perl теперь поддерживает "сверхжадные квантификаторы"(possessive quantifier) которые захватывают максимальное соответствие и никогда не возвращаются назад. Таким образом они могут быть использованы для контроля отката назад(control backtraking). Сверхжадный квантификатор синтаксически может использоваться там же где и нежадный модификатор(non-greedy) ?, только вместо него ставится модификатор + . В результате получаются примерно такие конструкции ?+, *+ , ++ , {min,max}+ .

    P.S: По сверхдажным квантификаторам есть хорошая статья на хабре

  • Глаголы Backtracking контроля

    Машина регулярных выражений поддерживает ряд глаголов специального назначения для контроля отката назад(backtrack control): (*THEN), (*PRUNE), (*MARK), (*SKIP), (*COMMIT), (*FAIL) и (*ACCEPT). За подробностями обращайтесь к странице perlre. (Yves Orton)

  • Относительные обратные ссылки (Relative backreferences)

    Новые синтаксические конструкции \g{N} или \gN где "N" десятичное число позволяет безопасную форму обозначений ссылок на найденный текст а также позволяет относительные ссылки на найденный текст. Это должно сделать легче генерацию и вставку шаблонов, которые содержат ссылки на найденный текст. Смотрите Буферы захвата . (Yves Orton)

  • Метазнак \K

    Функциональность модуля Regexp::Keep Джеффа Пинуана(Jeff Pinyan) была встроена в ядро. В регулярных выражениях вы можете теперь использовать специальный метасимвол \K как способ исользовать что-нибудь наподобие конструкции плавающего позитивного заглядывания назад

       s/(foo)bar/$1/g
     

    что может быть преобразовано в

       s/foo\Kbar//g
     

    который является гораздо более эффективным. (Yves Orton)

  • Вертикальный, горизонтальный пробел и разрыв строки

    Регулярные выражения теперь распознают escape последовательности \v и \h которые соответствуют символам вертикального и горизонтального пробела. \V и \H логично противоположны первым двум метасимволам.

    \R соответствует общему символу разрыва строки, то есть символу вертикального пробела плюс последовательность символов "\x0D\x0A" .

Statistic

About this Archive

This page is an archive of recent entries in the perl5100delta category.

Разное is the next category.

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