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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не ищет по шаблону, Не ищет по шаблону, почему? 
V
    Опции темы
Pheanix
Дата 28.11.2007, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Люююдддиии!  smile подскажите плиз! 
Делаю скрипт, который будет лезть в базу ms sql селектом забирать от туда одну строку, и чтоб эта строка сравнивалась с шаблоном!
Шаблон хранится в файле trap.txt.
Текст файла, из которого берутся шаблоны :
NO TRAPD.CONF FMT FOR;(Integer): 18  [4];"no toner";
NO TRAPD.CONF; (Integer): 18  [4];"cose";
NO TRAPD.CONF FMT FOR .1.3.6.1.2.1.;(Integer) 19  [4];"open ";

Вот часть скрипта, ответственного за это :

open (TRAP, "c:/trap.txt") or die "cannot open file trap.txt";
while($line =<TRAP>)
{
#цикл по строкам файла
#разбираем каждую строку файла на переменные по разделителю ';'
($name1,$name2,$name3)=split(";",$line);

#сравниваем со значением полей. если нашли совпадение 
#переменная $message  - это поле из БД MSSQL
if (($message=~/$name1/i) and ($message=~/$name2/i)) {$message1=$name3;last;} else {$message1="test";}
 };
#соответственно, если находит сходство $message с двумя шаблонами $name1 и $name2, то $message1 должно равняться $name3
#однако у меня все время выдает  $message1="test"! А не должно!! Текст шаблонов совпадает с строкой $message. 
close (TRAP);

Есть идеи?
кстати, если нужна строка message для сверки, то вот:
10.0.23.40: NO TRAPD.CONF FMT FOR .1.3.6.1.2.1.43.18.2.0.0 ARGS(7): [1] mgmt.mib-2.43.18.1.1.1.1.29 (Integer): 29  [2] mgmt.mib-2.43.18.1.1.2.1.29 (Integer): 4  [3] mgmt.mib-2.43.18.1.1.4.1.29 (Integer): 18  [4] mgmt.mib-2.43.18.1.1.5.1.29 (Integer): 26  

Это сообщение отредактировал(а) Pheanix - 28.11.2007, 20:31
PM MAIL ICQ   Вверх
Anarki
Дата 28.11.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Потому что $name1, $name2 подставляются в регулярное выражение не экранированные.
Используйте quotemeta.
Код

my $nname1 = quotemeta($name1);
my $nname2 = quotemeta($name2);
if (($message=~/$nname1/i) and ($message=~/$nname2/i)) {
   $message1=$name3;
   last; # вам видней
} else {
   $message1="test";
}




--------------------
PM WWW   Вверх
Pheanix
Дата 29.11.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое. Но вроде у меня получилось!!!
Я добавил в текст вот такую штуку, чтобы он из сообщения $message убирал все знаки .[]():
вот то, что добавил
$message=~s/ |\.|\[|\]|\(|\)|\-|\://g;
$name1=~s/ |\.|\[|\]|\(|\)|\-|\://g;
$name2=~s/ |\.|\[|\]|\(|\)|\-|\://g;

но твой способ тоже обязательно проверю!

Спасибо большое за помощь!!!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




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


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

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