PERL: БИБЛИОТЕКА ПРОГРАММИСТА



              

PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 187



до конца строки


6.7. Чтение записей с разделением по шаблону   195

Если комментарии лишь затрудняют понимание, ниже тот же пример перепи­сан в виде короткой командной строки:

% perl -OOpe    s{\A(Chapter\s+\d+\s*    *)}{<H1>$1</H1>}gx    datafile

Возникает интересная проблема: в одном шаблоне требуется указывать как на­чало записи, так и конец строки. Начало записи можно было бы определить с помощью ", но символ $ должен определять не только конец записи, но и конец строки. Мы добавляем модификатор /ш, отчего изменяется смысл как ", так и $. На­чало записи вместо " определяется с помощью \А. Кстати говоря, метасимвол \Z (хотя в нашем примере он не используется) совпадает с концом записи даже при наличии модификатора /т.

Следующий пример демонстрирует совместное применение /s и /т. На этот раз мы хотим, чтобы символ " совпадал с началом любой строки абзаца, а точка — с переводом строки. Эти модификаторы никак не связаны, и их совместное при­менение ничем не ограничено. Стандартная переменная $ содержит число запи­сей последнего прочитанного файла. Стандартная переменная $ARGV содержит файл, автоматически открываемый при обработке <ARGV>.

$/ =       # Режим чтения абзацев while (<ARGV>) {

while (m#"START( *?)~END&sm) { # /s - совпадение  с переводом строки

# /m - совпадение " с началом

внутренних строк print chunk $ in $ARGV has «$1»\n ,

Если вы уже привыкли работать с модификатором /т, то " и $ можно заменить на \А и \Z. Но что делать, если вы предпочитаете /s и хотите сохранить исходный смысл ? Воспользуйтесь конструкцией [~\п] Если вы не намерены использо­вать /s, но хотите иметь конструкцию, совпадающую с любым байтом, сконструи­руйте символьный класс вида [\000-\377] или даже [\d\D]. Использовать [ \п] нельзя, поскольку в символьных классах   не обладает особой интерпретацией.

> Смотри также---------------------------------------------------------------------------------------------




Содержание  Назад  Вперед