Forum Webscript.Ru
Программирование => Perl => Тема начата: 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 раз...)
Подскажите...
-
очень странно:
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>
-
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>
-
Спасибо, с этим отработало на ура.
но по идее ведь мой регэксп тоже должен работать нормально?
-
нет.
perldoc perlre | less -p greedy
-
ага, спасибо - все понял...
такой вот вариант решил конкретно эту проблему, но не по всему файлу,
/From:\\s+(.+)\\@(.+?)\\.(\\w+)\\,/;
Ваш вариант наиболее жизнесопсобен.
-
достаточно уменьшить прожерливость регекспа и все заработает
while( ) {
chomp;
/From:\\s+(.+?)\\@(.+?)\\.(\\w{0,4})\\,/;
print "$1\\@$2.$3\\n";
}