[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