Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не парные скобки в регулярных выражениях 
:(
    Опции темы
korob2001
Дата 18.6.2004, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Привет!
Написал гостевую, всё работает на ура. Но возникла такая проблема.
Запускаю скрипт и ввожу такое сообщение:
Hi! My name is Dennis. ;)

После отправки получаю такое сообщение:
Unmatched ) in regex; marked by <-- HERE in m/Hi! My name is Dennis. ;)<-- HERE / at z:\home\LOCALH~1\cgi-bin\rst\gb\gb.pl line 63, <GB> line 1

Вот часть кода где всплывает ошибка:
Код

61:  open( GB, "< $file" ) or die $!;
62:      while ( <GB> ) {
63:        if ( m/$mess/ ) {
64:          push(@errors, "Такое сообщение уже есть в базе. Не стоит повторяться.");
65:          last;
66:        }
67:      }
68:  close( GB ) or die "$!";

Нуменрация строк приведена так как в программе.
$mess - полученное сообщение из формы.

Впринципе ошибка ясна, но проблема с её решением, я с такой ошибкой столкнулся впервые. Помоему как-то нужно заключить в кавычки с помощью qr() переменную $mess. Попробовал, не получилось. sad.gif

Заранее спасибо,
Денис

Это сообщение отредактировал(а) korob2001 - 18.6.2004, 17:21


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Secandr
Дата 18.6.2004, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 1
Всего: 39



korob2001
я такую проблему решал просто экранируя все спец символы: $@.[]{}()\/
Т.е. добавляю /
Добавлено @ 17:44
Дело в том, что /$m/ - подставляет символы в // и например если у тебя $m=".*" то /$m/ всегда будет верным.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
korob2001
Дата 18.6.2004, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Secandr
Что ты подразумеваешь под словом экранирование? Если это перекрытие специальных символов обратым слэшем, то они ведь тоже пропишутся в файл, что не желательно. Хотя можно удалить их после проверки или содать, временную, копию переменной $mess. Сверять копию а в файл прописать оригинал, если условие выполнено.
Всё же мне что-то подсказывает что можно найти более оптимальный вариант.
Что думаешь?

Цитата

Дело в том, что /$m/ - подставляет символы в // и например если у тебя $m=".*" то /$m/ всегда будет верным.

Да, я знаю, что регулярное выражение вида m/.*/ всегда истенна, даже если строка будет пустой. Но в моём случае она не будет пустой. Так как проверка на заполнение происходит чуть раньше. Если поле пустое, то программа завершается и просит заполнить поля. Код написанный выше не позволяет ввести, случайно, сообщение 2 раза подряд.



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
achmed
Дата 19.6.2004, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 12.4.2004

Репутация: нет
Всего: нет



а зачем здесь использовать РВ ?
что нельзя просто сравнить строки ?
if ($mess eq $_ ) {
..
PM MAIL   Вверх
Secandr
Дата 19.6.2004, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 1
Всего: 39



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


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
korob2001
Дата 19.6.2004, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата

а зачем здесь использовать РВ ?
что нельзя просто сравнить строки ?
if ($mess eq $_ ) {
..

Каждая строка в файле примерно такого вида:
Имя=email=сообщение=время добавления\n

Получается сначала нужно разбить строку split'ом, тогда можно будет сравнить строки. Но при таком раскладе мне кажется что производительность будет не высокая.

Цитата

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

Я тоже так сделал, вроде работает нормально.

Спасибо за помощь.

Это сообщение отредактировал(а) korob2001 - 19.6.2004, 17:04


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.