Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Сортировка писем. Помогите с дескрипторами файлов.


Автор: labertos 4.3.2012, 16:06
Написал программку, которая раскидывает все письма с одного почтового ящика в отдельный файл. 
Каждое новое письмо начинается с новой строки "From "почтовый ящик" ".

Код

open unix, "unix.mailbox";
while ($_ = <unix>)
{
  if (/^From (\w+@\w+.\w+) /) 
  {
    $file=">> ".$1;
    open file;
    print file $_;
  } 
  else
  {
    print file $_;
  }
}


Нужно было сделать тоже самое, но при условии, что каждый файл будет открываться\закрываться лишь один раз. Решил сохранять дескриптор каждого файла в переменную, при открытии файла. А при необходимости использовать.
Код

select("дескриптор");
print "выражение";

Получилось это.
Код

open unix, "unix.mailbox";
while (<unix>)
{
 if (/^From (.*) /) 
 { 
  $filename=$1;
  if (-e($filename)) 
  {  
   select (${$filename}); 
   print $_;
  }
  else
  {
   $file=">> ".$filename;
   open file;
   print file $str;
   $file=~s/>> //;
   ${$filename}=select;
  }
 }
  else
  { 
   print $str;
  }
}

С Perl'ом знаком около недели. Просьба подсказать в чем ошибка. Варианты с использованием массивов не предлагать. Хочу с дескрипторами разобраться, раз взялся.

Автор: Pfailed 4.3.2012, 18:14
В строке 18, видимо, нужно ${$filename}=file;
Плюс советую проверять не произошло ли ошибки при открытии файла.

Автор: DurRandir 4.3.2012, 19:00
Ну и стилистическое: use strict, use 3 arg open, print можно сразу отправлять в нужный fh, без лишних select(). Вместо ${$..} - хэши (но это поймает strict).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)