Forum Webscript.Ru

Программирование => Perl => Тема начата: cr4ck3r от 14 Июня 2006, 15:55:52

Название: Странности регулярного выражения
Отправлено: cr4ck3r от 14 Июня 2006, 15:55:52
Или просто я что-то очевидное не вижу.
Произвожу посик по файлу, и в нем идут такие вот данные
(здесь привожу 2 строчки из файла)
Цитировать

[01/Jun/2006 15:30:10] Message detected as spam with score: 10.00, threshold 7.00, To: blablablaIV@myserver.ru, Message size: 3159, From: usuiremdxiz@hotmail.com, Subject: раскрутим..Fri, 02 Jun 2006 01:01:12
[30/May/2006 20:00:12] Message detected as spam with score: 9.29, threshold 7.00, To: blablablaAA@myserver.ru, Message size: 5397, From: linda@horafeliz.com, Subject: Срочно перезвони!

Мне нужно выдернуть адрес отправителя (спамера),
я использую такой регэксп:
(привожу кусок скрипта):

open(FILE,"<",$file) || die "can\'t read file $file: $!\\n";
while() {
chomp;
/From:\\s+(.+)\\@(.+)\\.(\\w{0,4})\\,/;
print "$1\\@$2.$3\\n";
}
close(FILE);

и вот что сранно,  строчки файла - почти идентичные, а результат выводимый принтом такой:
для первой строки:
Цитировать

usuiremdxiz@hotmail.com, Subject: раскрутим..Fri

для второй строки:
Цитировать
linda@horafeliz.com


В чем дело? Почему в вывод попадает мусор (файл размером 3,5Mb и в нем мусор проскакивает 5-8 раз...)

Подскажите...
Название: Странности регулярного выражения
Отправлено: arto от 14 Июня 2006, 16:10:43
очень странно:

  DB<1> $a1 = "[01/Jun/2006 15:30:10] Message detected as spam with score: 10.00, threshold 7.00, To: blablablaIV@myserver.ru, Message size: 3159, From: usuiremdxiz@hotmail.com, Subject: раскрутим..Fri, 02 Jun 2006 01:01:12"

  DB<2> $a2 = "[30/May/2006 20:00:12] Message detected as spam with score: 9.29, threshold 7.00, To: blablablaAA@myserver.ru, Message size: 5397, From: linda@horafeliz.com, Subject: Срочно перезвони!"

  DB<3> if ($a1 =~ m/From:\\s+(.+)\\@(.+)\\.(\\w{0,4})\\,/) { print "$1\\@$2.$3\\n"; }

  DB<4> if ($a2 =~ m/From:\\s+(.+)\\@(.+)\\.(\\w{0,4})\\,/) { print "$1\\@$2.$3\\n"; }

  DB<5>
Название: Странности регулярного выражения
Отправлено: arto от 14 Июня 2006, 16:15:47
DB<11> if ($a1 =~ m|From: ([^,]+),|) { print "$1\\n"; }
usuiremdxiz@hotmail.com
  DB<12> if ($a2 =~ m|From: ([^,]+),|) { print "$1\\n"; }
linda@horafeliz.com
  DB<13>
Название: Странности регулярного выражения
Отправлено: cr4ck3r от 14 Июня 2006, 16:28:19
Спасибо, с этим отработало на ура.
но по идее ведь мой регэксп тоже должен работать нормально?
Название: Странности регулярного выражения
Отправлено: arto от 14 Июня 2006, 16:48:32
нет.
perldoc perlre | less -p greedy
Название: Странности регулярного выражения
Отправлено: cr4ck3r от 14 Июня 2006, 17:26:26
ага, спасибо - все понял...
такой вот вариант решил конкретно эту проблему, но не по всему файлу,
Цитировать

/From:\\s+(.+)\\@(.+?)\\.(\\w+)\\,/;

Ваш вариант наиболее жизнесопсобен.
Название: Странности регулярного выражения
Отправлено: xames от 17 Июня 2006, 01:05:18
достаточно уменьшить прожерливость регекспа и все заработает


while( ) {
   chomp;
   /From:\\s+(.+?)\\@(.+?)\\.(\\w{0,4})\\,/;
   print "$1\\@$2.$3\\n";
}