Шаг 6 - Шаблоны и все что с ними связанно.

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

Оператор =~ и !=.

Оператор =~ наиболее важный для работы с шаблонами. Он связывает переменную, которая стоит перед ним, и шаблоном стоящим после него (он в принципе ничего не выполняет, кроме того, что привязывает переменную к оператору, который в свою очередь выполняет определенные действия над ним). Оператор != работает с точностью до наоборот.

Пример:

$var =~ /w+/
Здесь =~ привязывает переменной $var оператор /w+/, который выполняет поиск первого слова в этой переменной.

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

$var = "Hello world!!!!";
$var =~ /Hello (\w+)/;
printf "Результат: $1\n";
После запуска программы, она выдаст:
 Результат: world
Здесь происходит поиск слова стоящего после слова Hello. Найденное слово заносится в переменную $1. Надо сказать, что оператор привязки может и не использоваться, тогда операторы будут брать данные из переменной $_.

Пример:

$_ = "Hello world!!!!";
/Hello (\w+)/;
printf "Результат: $1\n";
Этот пример будет аналогичен вышеизложенному и результат будет точно такой же.

Оператор поиска

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

Синтаксис:

   m/шаблон/параметр
где место слово "параметр" ставятся параметры поиска:
ПараметрОписание
gГлобальный поиск.
iСравнение не зависит от регистра (верхний или нижний)
mСтрока многострочная
oОднопроходная компиляция
sОднострочная строка
xИспользуются расширенные регулярные выражения.

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

Пример:

$var = "Hello world!!!!";
$var =~ /(\w+)(\w+)/;
printf "Результат: $1 $2\n";
Результат:
  Результат: Hello world
В случае удачного завершения операции возвращается true, а если ничего найти не удалось тогда false. К примеру:
if ( $var =~ /+w/ )
{  print "Найдено!!!\n"; }
else
{ print "Найдено!!!\n"; }

Шаблоны

Прежде всего надо сказать, что шаблоны подобны двойным кавычкам, то есть в них допускается использование переменных и специальные символы (например \n - новая строка)

Шаблон не был бы шаблоном, если бы не метасимволы - символы обозначающие группы других символов. Имеются следующие метасимволы.

\Отменяет действие следующего за ним метасимвола и считает его как обычный символ
()Группировка.
.Один произвольный символ. Кроме '\n' - конец строки.
$Конец строки
|Альтернатива
^Начало строки
[]Множество символов.
Рассмотрим для примера, метасимвол '()' - стоит оговорится, что при поиске, результат выражения будет содержаться именно в круглых скобках.
/Hello (\w+)/;
Здесь в круглых скобках используется метасимвол /w, он характеризует один алфавитно-цифровой символ. Знак '+' - модификатор, он характеризует число повторений метасимвола.

Имеются следующие модификаторы:

*Повторяется 0 или большее число раз
+-//- 1 или большее число раз
?1 или 0 раз
{n}точно n раз
{n,m}не меньше n, но и не больше m
Как можно заметить, что все выражение '\w+', можно подставить в место любого слова (повторение буквенных символов и есть слово), то есть, имеется возможность сделать собственные универсальные шаблоны.

Для полного понятия рассмотрим еще несколько дополнительных метасимволов:

\wАлфавитно-цифровой или '_' символ
\Wне -//-
\sодин пробел
\Sодин не пробел
\Dодна не цифра
\dодна цифра
\bГраница слова
\Bне граница слова
\Aначало строки
\Zконец начало строки
\Gконец действия m//g

Оператор замены

Синтаксис следующий:
  s/шаблон/подстановка/параметр
Оператор замены подобен оператору поиска, различие состоят в том, что у него используется еще один аргумент 'подстановка' - это выражение подставляется вместо найденного по шаблону выражения, так же существуют различия в параметрах:
ПараметрОписание
gГлобальный поиск.
iСравнение не зависит от регистра (верхний или нижний)
mСтрока многострочная
oОднопроходная компиляция
sОднострочная строка
xИспользуются расширенные регулярные выражения.
eРассматривать правую часть как выражение
Пример:
$var =~ s/привет/hello/;
здесь происходит замена слова 'привет' словом 'hello'. Также допускается использование метасимволов:
var =~ s/привет \w+/hello/;
в данном случае произойдет замена слова 'привет' и следующего за ним слова на слово 'hello'.

В случае удачного успешного завершения операции возвращается количество замен, а если ничего найти не удалось тогда false или 0.

Оператор замены tr.

Синтаксис:
  tr/таблица1/ таблица2/параметры
В отличии от вышеизложенного оператора замены, этот оператор заменяет все символы выражения указанные в 'таблице1' на символы в 'таблице2'.

Имеет следующие параметры:

cДополнение 'таблица1', то есть заменяются те символы, которые не стоят в 'таблица1', немного похожа на операцию NOT
dCтереть найденные, но не замененные символы
s"сжать" повторяющиеся замененные символы, то есть если после замены в подряд идут несколько одинаковых символов, то они сжимаются в один.
Пример:
  $ var = "Hello All";
  $ var =~ tr/l/L/;
  print "$var\n";
Получим:
  HeLLo ALL.


Предыдущий Шаг | Следующий Шаг | Оглавление

By Vasya Vazhesov.