[Moscow.pm] Быстрый парсинг email-сообщений

Alex Kapranoff alex на kapranoff.ru
Чт Фев 12 08:50:16 PST 2009


Walery Studennikov wrote:
> Hi.
> 
> Сейчас дописываем свой модуль для работы email-сообщениями
> (парсинг сообщений, сопоставление с шаблонами, поиск нужных сообщений в mbox-ах,
> выдирание из них нужной информации и т.д. и т.п.).
> Основные требования:
> - модуль должен быть ультратёгким, без лишних зависимостей,
> - ультрабыстрым (т.к. будет перемалывать большие массивы данных).
> 
> Когда модуль устаканиться, выложим на CPAN.
> 
> Так вот, одна из загвоздок, с которой столкнулись -- это
> отделение header от body в rfc822-сообщениях.
> 
> Т.е. нужно некое преобразование, которое
> на входе получает целое сообщение ($message),
> на выходе -- разрезанное: $header, $body.
> 
> Сейчас используется:
> @$self{ qw/raw_header body/ } = ($body =~ m/(.+?)(?:\r?\n){2}(.+)/som);
> До этого использовалась комбинация index / substr.
> Однако, скорость преобразования при этом недостаточна.
> 
> Вопрос: как это можно сделать наиболее быстро на Perl, не прибегая к XS.
> 
> Ваши варианты? ;)

split(,,2) по вышеуказанному регекспу :)

Ну и ещё я бы уточнил источник писем -- обычно либо юниксовые концы 
строк, либо smtp-шные, но не вперемешку. Соответственно есть шанс 
перейти к фиксированной строке в качестве регекспа, а это очень быстро.


Подробная информация о списке рассылки Moscow-pm