Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > Не ищет по шаблону


Автор: Pheanix 28.11.2007, 20:20
Люююдддиии!  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  

Автор: Anarki 28.11.2007, 22:54
Потому что $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";
}


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

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

Спасибо большое за помощь!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)