Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка почтового ящика 
:(
    Опции темы
princessik
Дата 19.5.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 19.5.2011

Репутация: нет
Всего: нет



Подскажите пож-та как отсортировать письма в почтовом ящике по отправителям (то бишь у меня есть 1 файл в котором куча писем начинающихся со строки from адрес@адрес потом разная дополнительная информация, потом текст письма (иногда довольно большой)  нужно насоздавать кучу файликов с текстами писем по каждому отправителю (если им написано несколько писем то все они должны лежать в одном файле)

мой код громоздкий, хотела бы узнать есть ли более элегантное решение
P.S
каждый файл должен открываться/закрываться только 1 раз;
P.P.S
 в программе нельзя использовать сторонние модули;
Код

$i=0;
$dlina=0;
our $pos=tell(F);
our $pos2=tell(F);
our $pochta="000";
$prev="";

                                  open(F, "unix.mailbox") ||
                                  die "Oshibka pri otkritii faila: $!";
                                
                                  while ($str=<F>)

  { 
  $pos=tell(F);         #устанавливается текущая позиция
  $pos2=tell(F);
                                 
  if($str=~m/(from*\s+[-.\w]+@(?:[a-z\d][-a-z\d]+\.)+[a-z]{2,6})/gi) 
                                      {  $pochta=$1;
                                            if ($prev!~m/$pochta/gi)      #если отправитель ранее не встречался в письме
                                             {
                                               $i++;   
                                               open (FFF,">myfilik$i.mailbox"); 
                                          
                                               print FFF "$str\n";
                                               poisk_end_of_mail($pos);
                                               $zap=$pos;  
                                               poisk_pisem($pos2);     #поиск других писем этого отправителя                                       
                                               seek (F,$zap,0);
                                             }
                                         
                                      }          

     flock(FFF,2);
    close(FFF);                           
  }

sub poisk_end_of_mail

seek (F,$pos2,0); 
while ($str2=<F>)
  {
   if($str2=~m/from*\s+[-.\w]+@(?:[a-z\d][-a-z\d]+\.)+[a-z]{2,6}/gi)  #граница
              { $dlina=length($str2);                                 #возврат каретки на нужную позицию
                $pos=tell(F);
                $pos=$pos-$dlina-100;         
                return $pos;
 
               }
     
    print FFF"$str2\n";
   }
}



sub poisk_pisem
     {
       while (($str3=<F>))
       { if ($str3=~m/$pochta/gi)
             { print FFF "$str3\n";
               $pos2=tell(F);           
               poisk_end_of_mail($pos2);
               $prev.=$pochta; 
               $prev.=chomp($prev); 
             }
         }
     return $pos2;
     }


объем  RAM  ограничен,  поэтому нельзя в памяти "лишних"
структур  и  данных,  без которых можно обойтись;

 



PM MAIL   Вверх
arto
Дата 19.5.2011, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



примерно так, не тестировал:

perl -MIO::File -lne 'BEGIN { $/ = "From "} my ($from) = m#(\S+)#; $hash{$from} ||= new IO::File("> $from"); $hash{$from}->print ("From $_")'

Добавлено через 2 минуты и 54 секунды
ps. IO::File -- стандартный модуль.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0969 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.