Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

CGI-программирование с самого начала


Информационный Канал Subscribe.Ru

Уважаемые подписчики!

Этот выпуск мы начнем с двух хороших новостей.

Первая: изменился сайт рассылки - теперь это наш проект "CGI Scripts Info: все о CGI-скриптах на Perl"

Это связано с тематическим разделением сайта "AC-Power: все про Интернет и для него" (старый сайт рассылки) и переносом всех материалов по веб-программированию (раздел "Perl / CGI") на новый сайт. Тематиками сайта "AC-Power" останутся: тонкости использования Интернет, интересные сервисы Сети, технические аспекты Сети - все то, что касается "продвинутого" использования Интернета.

По нашему мнению, такое тематическое разделение позволит более полно развивать оба сайта - на сайте "AC-Power" мы планируем новые интересные разделы для пользователей Всемирной Сети, а на сайте "CGI Scripts Info" появятся новые темы по веб-программированию.

Вторая хорошая новость - на сайте "CGI Scripts Info" открылся ФОРУМ, на котором можно пообщаться как на темы веб-программирования, так и на многие другие смежные темы.

Форум сделан на широко распространенном в Сети и, я думаю, многим уже знакомом движке phpBB2. Я сам являюсь пользователем нескольких форумов на базе phpBB, оценил его и считаю этот движок одним из лучших программных решений для форума по части функциональности - вы можете редактировать свои старые сообщения, вставлять смайлики, цитировать чужие сообщения и т.п. Работает система личных (приватных) сообщений между участниками форума, наподобие простой "внутренней" электронной почты. Вам также доступны уведомления по e-mail о новых сообщениях в интересующих вас топиках, поэтому не придется периодически "ходить" на форум в ожидании ответов.

Итак, приглашаю всех для участия в нашем Форуме!

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

Некоторые аспекты использования регулярных выражений

1. Сопоставление с шаблоном всей строки

Очень часто оператор сопоставления с шаблоном используется для проверки соответствия содержимого строки некоторому "общему виду" (в прошлом выпуске я даже обратил внимание, что обозначение этого оператора отдаленно напоминает математическое "приблизительно равно" :-) ).

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

Так, шаблону /\d\d\d\d/ будут соответствовать любые строки, в которых встречаются последовательности из 4-х цифровых символов. А вот шаблону /^\d\d\d\d$/ соответствуют именно строки из 4-х цифр.

2. Использование "отрицательных" метасимволов.

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

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

Выше мы рассматривали последовательность метасимволов "\d\d\d\d", соответствующую 4-х значному числу. Сам собой напрашивается следующий фрагмент:

$txt=~s/(\d\d\d\d)/$1+1/ge;

Однако проблема в том, что выражение "\d\d\d\d" соответствует не только числу из 4-х цифр, но и части числа из большего количества цифр!

Пример:

$txt="2001 2002 123456789";
$txt=~s/(\d\d\d\d)/$1+1/ge;
print $txt;
#результат: "2002 2003 123556799"

Поэтому нам надо более конкретно определить заменяемую последовательность (число из четырех цифр), а именно - "четыре цифры, окруженные нецифровыми символами". Наш оператор замены при этом изменяется следующим образом:

$txt="2001 2002 123456789";
$txt=~s/\D(\d\d\d\d)\D/$1+1/ge;
print $txt;
#результат: "20022003123456789"

И опять мы получили что-то не то :-) Исчезли пробелы. Также исчезнут и любые нецифровые символы, окружающие заменяемое четырехзначное число.

Это происходит потому, что эти символы у нас "теряются" при замене - они входят в заменяемое выражение, но не входят в заменяющее. Чтобы этого не происходило, включим их без в заменяющее выражение без изменений. Для этого в шаблоне организуем не одну, а три группы в круглых скобках: "(\D)(\d\d\d\d)(\D)". Соответствия этим скобкам будут присвоены соответственно переменным $1,$2,$3. Заменяющее выражение у нас меняется следующим образом: $1.($2+1).$3

$txt="2001 2002 123456789";
$txt=~s/(\D)(\d\d\d\d)(\D)/$1.($2+1).$3/ge;
print $txt;
#результат: "2002 2003 123456789"

То, что надо! :-)

3. Использование метасимвола '.' с модификаторами

Поскольку метасимвол '.' обозначает "любой символ", то шаблону

/.*/

будет соответствовать любая строка, из любых символов и любого их количества. Понятно, что такой шаблон "в чистом виде" практически не применяется (а какой смысл?), однако последовательность '.*' часто применяется в составе более сложных шаблонов для обозначения произвольных последовательностей переменной длины (аналогично - последовательность '.+' обозначает произвольную цепочку символов ненулевой длины).

Это очень удобно, если в сопоставляемой строке предполагаются некоторые "опорные точки" (однозначные последовательности символов), между которыми может быть любой текст. Например, адрес e-mail имеет опорную точку в виде символа '@', разделяющего имя пользователя (почтового ящика) и доменное имя сервера. Допустим, нам надо "разобрать" строку с адресом электронной почты, выделив из нее имя пользователя и имя сервера. Сделать это можно так:

$a="name\@host.com"; #Пример адреса e-mail
$a=~/(.*)@(.*)/;        #Разбираем адрес
print "user $1 on host $2";

Аналогично можно организовать "разбор" различных лог-файлов, в которых строки представлены в виде последовательностей-разделителей, а также строки "текстовой" базы данных, различных командных строк.

На сегодня все. До следующих выпусков!


Успехов!
Андрей
angel07@inbox.ru

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: inet.webbuild.perlcgi
Архив рассылки
Отписаться
Вспомнить пароль

В избранное