Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Синтаксис регулярных выражений




 

Регулярное выражение представляет собой текстовый шаблон, по которому ведется поиск нужных символов в строке.  

 Шаблон заключается в ограничители, в качестве которых в Perl может быть использован любой символ, например, в выражении/abc/последовательность символов "abc" является шаблоном, а символ "/" ограничителем. Обычно в качестве ограничителя используется символ "/", за исключением тех случаев, когда он встречается в шаблоне. Поэтому в дальнейшем в тексте для краткости в качестве ограничителя будет применяться символ "/", хотя можно было использовать и другой символ, например символ ":" или "*". Если символ "/" встречается в шаблоне, перед ним необходимо поставить обратный слеш.

В качестве ограничителей могут использоваться также круглые ("(" и ")"), квадратные ("[" и "]"), фигурные ("{" и "}") и угловые ("<" и ">") скобки, например, {abc}.

Символ или символы перед начальным ограничителем определяют тип оператора, для регулярного выражения. Для некоторых типов операторов, наряду с символьным обозначением оператора, используются так называемые пользовательские (customary) обозначения операторов.

В Perl определены следующие типы операторов для регулярных выражений:

· q/строка/ – строковый литерал, в котором не производятся никакие замены;

· qq/строка/ – строковый литерал, в котором могут производиться замены;

· qw/список/ – строковый литерал, содержащий элементы списка, разделенные пробелами;

· qx/строка/ – строковый литерал, содержащий команду;

· m/шаблон/ – поиск соответствий;

· s/шаблон/значение-замены/ – поиск и замена символов по заданному шаблону поиска и последовательности замены;

· qr/строка/ – возвращает строку как шаблон;

· tr/список-поиска/список-замены/ – поиск и замена символов из списка шаблонов поиска на соответствующие элементы списка замены (вместо имени tr может использоваться его синоним y).

Оператор q/строка/ представляет собой строковый литерал, в котором не производятся никакие замены, за исключение специальных символов, например, "\n". Пользовательское обозначение этого оператора – заключение строки в одиночные апострофы.

Пользовательским обозначением оператора qq/строка/ является заключением строки в двойные апострофы.

Оператор qw/список/, возвращаетсписок.

При выполнении оператора qx/строка/ в строке производится поиск и замена идентификаторов, а затем полученная строка выполняется как команда. Пользовательским обозначением этого оператора служит заключение строки в обратные апострофы (символ "`").

Оператор m/шаблон/ выполняет поиск соответствий по заданному шаблону. Ее пользовательским обозначением является заключение шаблона в ограничители "/", т.е. если в качестве ограничителей используются символы "/", указатель типа оператора – символ m можно опустить, т.е. записи m/abc/ и просто /abc/ являются эквивалентными.

Строка, в которой выполняется поиск, должна быть предварительно присвоена переменной $_.

В скалярном контексте оператор m возвращает значение 1 (или истина), если указанная последовательность есть в строке, и пустая строка (или ложь) в противном случае. В контексте списка возвращается список из одного единственного элемента, значение которого равно 1, если последовательность есть в строке, или пустой список – в противном случае.  

Для того, чтобы выполнять поиск в произвольной строке, в Perl введены операторысвязывания "=~" и "!~".

Оператор идентификатор-переменной=~ m/шаблон/связывает переменную со строкой поиска, т.е. заданный поиск будет выполняться не в строке $_, а в указанной строке. Этот оператор возвращает значение истина, если заданная последовательность была найдена в строке и ложь – в противном случае.

Оператор "!~" отличается от оператора "=~" тем, что он возвращает значение ложь, если строка поиска найдена в указанной строке, и значение истина – в противном случае.

Оператор s/шаблон/значение-замены/осуществляет поиск и замену в строке. Как и для оператора поиска, строка, в которой выполняется поиск, должна быть предварительно присвоена переменной $_, либо строку для поиска или замены можно определить с помощью одной из операций связывания. Оператор возвращает количество замен, сделанных в строке или пустую строку, если не было сделано ни одной замены.

Оператор qr/строка/возвращает значение строки заданной в качестве параметра как шаблон в регулярном выражении. Это значение затем можно использовать как шаблон в операторах m и s.

Оператор транслитерации tr/список-поиска/список-замены/выполняет поиск в строке элементов, указанных в первом списке, и заменяет их на соответствующие элементы из второго списка. По умолчанию поиск и замена выполняются в строке, находящейся в переменной $_, либо переменная для поиска и замены определяется с помощью операции связывания.

В списке-поискаи в списке-заменыможно указывать также диапазон символов. Если количество символов в списке-заменыменьше, чем в списке-поиска, то все лишние символы в списке-поиска заменяются на последний символ в списке-замены.

Если в списке-поискаи/или в списке-заменынеобходимо указать переменные, то необходимо вычислить выражение tr с использованием встроенной функции eval.

 

Вспомогательные переменные и опции в регулярных выражениях

 

Помимо переменной $_, при работе с регулярными выражениями можно использовать следующие вспомогательные переменные:

$& – содержит найденное значение шаблона;

$` – содержит подстроку исходной строки перед найденным шаблоном;

$' – содержит подстроку исходной строки после найденного шаблона.

После последнего ограничителя символа для некоторых типов регулярных выражений можно задать одну или несколько односимвольных опций, уточняющих выполняемую операцию.

Опции, допустимые в Perl, приведены в таблице:

 

Опция Действие В каких типах регулярных выражений используется
c Не обнуляет позицию поиска при не найденном соответствии шаблона и символов строки, если включена опция g. m
c Для поиска будет использован не сам список, а его дополнение tr
d Удаление найденных, но не замененных символов tr
e Вычисление значения замены как выражения. s
g Глобальный поиск соответствий, т.е. нахождение всех соответствий. m,s
i Поиск соответствий без учета регистра (для букв). m,qr,s
m Строка рассматривается как последовательность строк, т.е. учитывается символ "\n" как символ конца строки. m,qr,s
o Компиляция шаблона только один раз (по умолчанию, поскольку шаблон может содержать переменные, каждый раз перед выполнением очередной операции, производится компиляция шаблона). m,qr,s
s Строка рассматривается как последовательность символов (символы "\n" игнорируются как символы конца строки). m,qr,s
s Если идущие друг за другом символы строки преобразуются к одному и тому же символу, в преобразованной строке сохраняется только один символ. tr
x Использование расширенных регулярных выражений. m,qr,s
U Преобразование в соответствии с кодировкой UTF-8. tr
C Преобразование в 8-битовый символ. tr

 

Метасимволы

 

Внутри шаблона большинство символов соответствуют сами себе, однако следующие символы при их использовании внутри шаблона имеют специальные значения:

 

^ $ ( ) \ | @ [ { ? . + *

Эти символы называются метасимволами и именно их использование обеспечивает всю мощь и гибкость регулярных выражений.

Если метасимвол необходимо использовать в шаблоне как обычный символ (например, для поиска), необходимо перед ним поставить обратный слеш – "\".

Если в шаблоне необходимо использовать символ "\", то он обозначается символами "\\".

Если в шаблоне необходимо указать символы перевода строки, возврата каретки, табулятора и новой страницы, используются специальные символы "\n", "\r", "\t" и "\f". Можно также задать любой символ ASCII в виде "\xкод", где код – шестнадцатеричный код символа (в диапазоне от "\x00" до "\xff").

В регулярных выражениях можно объединять несколько шаблонов, так чтобы найденная строка соответствовала хотя бы одному из них. Для решения по­добной проблемы служит операция альтернации, которая в регулярных выражениях задается символом "|".

Операция группировки элементов, т.е. заключение группы элементов в круглые скобки, позволяет рассматривать данную группу элементов как один элемент.

Метасимвол точка "." внутри регулярного выражения точка соот­ветствует любому одиночному символу, кроме символа перевода строки.

Квантификаторы– это метасимволы, используемые для указания количественных отношений между символами в шаблоне и в искомой строке. Квантификатор может быть поставлен после одиночного символа или после группы символов.

Простейшим квантификатором является метасимвол "+". Он означает, что идущий перед ним символ соответствует нескольким идущим подряд таким символам в строке поиска. Количество символов может быть любым (максимально большим в рамках соответствия шаблону), но должен присутствовать хотя бы один символ.

Действие метасимвола "*" похоже на действие метасимвола "+". Метасимвол "*" указывает, что идущий перед ним символ встречается нуль или более раз.

Метасимвол "?" указывает, что предшествующий ему символ должен встречаться либо один раз, либо не встречаться вообще.  

Если необходимо указать точно количество повторений символа, можно воспользоваться конструкцией

pat{n,m}

Здесь n – минимально допустимое количество повторений, m– максимально допустимое количество повторений, apat– символ или группа символов, для которых указывается количество повторений. Один из параметров n или m можно опустить.

В регулярных выражениях часто используют сочетание метасимволов ".*". Ему соответствуют любые символы.

Для поиска в регулярных выражениях можно задавать также классы символов, заключенные в квадратные скобки. Во время поиска все символы в классе рассматриваются как один символ. Внутри класса можно задавать диапазон символов (когда такой диапазон имеет смысл), по­мещая дефис между границами диапазона.

Если первым символом класса является знак вставки "^", то значение выражения инвертируется. Другими словами, такому классу соответствует любой символ, невхо­дящий в класс, например, шаблону

/[^A-Z]/

будут соответствовать любые символы, кроме символов верхнего регистра.

Так как в классах символы "]", "^" и "-" имеют специальное значение, для их использо­вания в классе существуют определенные правила. Литерал "^" не должен быть первым символом класса. Перед литералом "]" должен стоять символ обратной косой черты, например

/[abc\]]/.

Для помещения в класс символа "-" достаточно либо поставить его на первую позицию, либо поместить перед ним символ обратной косой черты.

В Perl имеются сокращения для некоторых часто используемых классов.

Наиболее употребительные сокращения приведены в таблице:

 

Сокращение   Описание  
\w Символ, встречающийся в словах (латинский алфавит), то же, что и [a-zA-Z0-9] .  
\W Символ, не встречающийся в словах, инверсия \w.  
\d Цифра, то же, что и [0-9] .  
\D Нецифровой символ.  
\s Символ пробела, то же, что и [ \t\f\r\n] .  
\S Символ, не являющийся пробельным символом.  
\b Соответствие границе слова.
\B Соответствие не границе слова.
\A Соответствие только в начале строки.
\Z Соответствие только в конце строки или перед символом "\n".
\z Соответствие только в конце строки.

 

Последняя группа метасимволов – это анкеры. С их помощью можно указать, в каком месте строки (в начале или в конце) должно быть найдено соответствие с шаблоном.

Первый из этих анкеров – символ вставки "^". Этот символ, помещенный в начале регулярного выражения, говорит о том, что соответствие шаблону должно быть най­дено в начале строки.

Символ доллара "$", помещенный в конец регуляр­ного выражения, говорит о том, что соответствие шаблону должно быть найдено в конце строки.

Если в регулярных выражениях Perl используются скобки, части искомой строки, соответствующие фрагментам в скобках, запоминаются в специальных переменных $1 (первый фрагмент в скобках), $2 (второй фрагмент в скобках), $3 (третий фрагмент в скобках) и т.д.

Следует отметить, что переменные $1, $2 и т.д. модифицируются при каждом успешном поиске, независимо от использования в регулярном выражении скобок. Кроме того, значения этих переменных устанавливаются тогда и только тогда, когда строка полностью соответствует шаблону.

 

Функции grep и man

 

Поиск в массиве по шаблону — одна из наиболее распространенных операций Perl. Например, необходимо узнать, в каких элементах массива строк встречается определенная подстрока. Для операций такого рода можно использовать функцию grep, для которой определены следующие две формы вызова:

grep выражение, список

grep блок,список

Функция grep проходит каждый элемент списка и выполняет для него указанное выражение или блок. Внутри выражения или блока в качестве очередного элемента списка выступает переменная $_. Если выражение истинно, данный элемент возвращается функцией grep.

Родственная grepфункция map имеет аналогичный синтаксис:

map выражение, список

map блок, список

Функция map проходит каждый элемент списка, присваивает ему значение $_ и выполняет для переменной $_ указанное выражение или блок. Функция возвращает список, состоящий из элементов, являющихся результатом выполнения выражения или блока для соответствующих элементов исходного списка.

 

Работа с файлами в Perl

 

Практические все операции по обработке данных на сервере выполняются с использованием файлов.

 

Открытие и закрытие файлов

 

Каждый раз, когда необходимо получить доступ к файлу на диске, необходимо создать новый дескриптор и открыть его. Для открытия дескрипторов, используется функция open:

 

openдескриптор-файла, режим-и-путь

 

Первый аргумент функции open определяет дескриптор файла, второй аргумент указывает режим доступа и путь к файлу.

Возможные режимы доступа приведены в таблице:

 

Режим   Чтение   Запись   Добавление   Создается при необходимости   Старые данные теряются  
< или не указан   Да   Нет   Нет   Нет   Нет  
> Нет   Да   Нет   Да   Да  
>> Нет   Да   Да   Да   Нет  
+< Да   Да   Нет   Нет   Нет  
+> Да   Да   Нет   Да   Да  
+>> Да   Да   Да   Да   Нет  

 

Путь указывает, какой файл необходимо открыть. При указании пути в Windows предпочтительнее указывать в качестве разделителя элементов пути не символ "\", а символ "/", например, " d:/work/myfile.txt".

Если не указан полный путь, функция open попытается открыть файл в текущем каталоге. При успешном открытии файла функция open возвращает ненулевое значение (истина), при неудачном — возвращается undef (ложь), например:

Функция die останавливает выполнение программы и выводит сообщение об ошибке:

 

Diedatимя-сценарияlineномер-строки

 

Здесь имя-сценария – название программы на Perl, номер-строки– номер строки, в которой встретилась функция die. Функции die и open часто используются вместе следующим образом:

 

open(MYTEXT, "novel.txt") || die;

Программа или открывает файл, или прекращает свое выполнение. Если open завершилась неудачно, возвратив ложное значение, вступает в действие логический оператор ИЛИ "||" (иногда используется другая форма записи этого оператора – or). В результате будет вычисляться аргумент, находящийся в правой части оператора (в данном случае – функция die). При удачном выполнении функ­ции open правая часть логического выражения не вычисляется.

В Perl предусмотрена специальная переменная $!, содержащая сообщение об ошибке, возникшей при выполнении последней системной операции (например, опе­рации дискового ввода-вывода). В числовом контексте конструкция $! возвращает номер ошибки. В строковом контексте переменная $! возвращает сообщение операционной системы об ошибке. 

Иногда нужно вывести в программе предупреждающее сообщение и продолжить ее выполнение. Для генерации предупреждений служит функция warn, аналогичная die, за исключением того, что выполнение программы продолжается.

Для закрытия деск­риптора используется функция close:

 

closeдескриптор-файла

 

Если попытаться открыть файл, указав в качестве параметров функции open один из уже открытых дескрипторов, то вначале этот дескриптор закрывается, а затем по­вторно открывается.

 

Чтение данных из файла

 

Для чтения информации из файла дос­таточно поместить его дескриптор в угловые скобки и присвоить это значение пере­менной.

Для чтения информации из файла удобно использовать цикл while. Если в цикле while вместо условного выражения используется угловой оператор, Perl автоматически присваивает введенную строку специальной переменной $_ и повторяет цикл, пока файл не закончится:

 

while(<MYFILE>)

{

print $_;

}

При этом в операторе while выполняется присваивание введенной строки переменной $_ и проверка признака достижения конца файла. Такое поведение реализовано только для цикла while и лишь тогда, когда условное выражение состоит из углового оператора.

Следует отметить, что в прочитанных из файла данных, кроме самого текста, содер­жатся также символы конца строки (так же как при вводе с клавиатуры). Поэтому, в случае, если нужен только текст, необходимо использовать функцию chomp, позволяющую удалить символы конца строки.

В контексте списка угловой оператор читает файл целиком и присваивает его списку. Каждая строка файла присваивается соответствующему элементу списка или массива. 

 

Запись данных в файл

Для записи данных в файл сначала нужно открыть сам файл для записи. Наиболее часто используются открытие файла со следующими режимами:

 

open(дескриптор, ">путь")

open(дескриптор, ">>путь")

 

Символ ">" перед путем говорит Perl, что в файл должны быть за­писаны новые данные. При этом уже имеющиеся данные в файле уничтожаются, и ука­занный дескриптор открывается для записи. Во втором форме символы ">>" также указывают, что файл открывается для записи, но если файл уже существует, новые данные дописываются в конец файла.

Функция close сообщает операционной системе, что запись в файл завершена, и данные должны быть помещены в место своего постоянного хране­ния на диске.

После того как файл открыт для записи, вывод в него данных выполняется с помощью функции print, которая уже использовалась для отображения данных на экране дисплея. Если перед списком в этой функции задать дескриптор файла, то вызов функции примет следующий вид:

 

printдескриптор,список

 

Здесь параметр дескриптор — это дескриптор файла, открытого для записи, а список — список элементов, которые нужно вывести в файл.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 336.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...