Главная страница


ru.cgi.perl

 
 - RU.CGI.PERL ------------------------------------------------------------------
 From : Artem Chuprina                       2:5020/400     06 Mar 2002  12:12:47
 To : Michael Tsaruk
 Subject : Re: Запись в файл и чтение из него
 -------------------------------------------------------------------------------- 
 
 Здравствуй, Michael Tsaruk.
 
  MT>>> Как произвести сабж?
  AC>> perldoc -f open, perldoc -f read, perldoc -f print
 MT> Я в этом не силён, но надо мне это сейчас по-зарез, не мог ли ты кинуть
 MT> простой примерчик в котором используется вышеупомянутая строка?
 
 Тогда напишем по-человечески... Может, и в FAQ стоит включить... Комментарии,
 естественно, в код включать не обязательно - они суть пояснения для чайника,
 программист и так поймет.
 
 # Полагаем, что в $path хранится путь к файлу. Относительный или абсолютный -
 # неважно, важно, чтобы по этому пути находился нужный файл
 
 # my-переменные хороши тем, что по выходе из области видимости (по тому же
 # die или просто по завершении функции) они дохнут. Для объектов IO::Handle и
 # потомков (в данном случае IO::File) это означает автоматическое закрытие
 # файла и освобождение соответствующих ресурсов. Однако помимо этого, я
 # постарался написать код так, чтобы с глобами он тоже работал
 
 use IO::File;
 
 # Специфика CGI состоит в том, что к одному файлу одновременно могут ломиться
 # несколько процессов. Поэтому файлы мы будем лочить. Если у кого DOS-based
 # винда, этому несчастному придется это делать иначе. Я бы посоветовал
 # радикально - путем смены операционки. Хотя бы на NT-based. Для того, чтобы
 # лочить файлы системно-независимо, надо импортировать несколько констант из
 # модуля Fcntl.
 
 use Fcntl qw(:flock);
 
 # Чтение
 
 my $fh = new IO::File "< $path" or die "Cannot open $path : $!";
 
 # Требуем блокировку на чтение. flock - функция блокирующая, то есть она будет
 # ждать, пока нужный лок не дадут. Она умеет работать в неблокирующем режиме,
 # но это отдельная песня
 
 flock($fh,LOCK_SH);
 
 # для текстового файла - чтение по строкам
 
 while (my $line = <$fh>) {
   # Тут работаем со строкой, считанной (вместе с \n) в $line
 }
 
 # для бинарного файла - чтение по блокам
 
 binmode($fh);
 my $buf;
 
 # По поводу этой константы можно развернуть отдельную дискуссию. Читайте
 # Стивенса, и ваши волосы будут;
 
 my $buflen = 8192;
 
 # Если Вы уверены, что весь файл влезет в память без особых проблем, то эту
 # строчку можно заменить на
 
 my $buflen = (stat($fh))[7];
 
 # Если быть совсем эстетом, то следует использовать File::stat, который
 # переопределяет stat так, что в скалярном контексте он возвращает объект, к
 # полям которого можно обращаться по имени, в данном случае ->size
 
 while (read($fh,$buf,$buflen)) {
   # Тут работаем с блоком, считанным в $buf
 }
 
 # Если у нас объект IO::File, то файл можно не закрывать, а просто дождаться,
 # когда $fh выйдет за пределы видимости. Если глоб, то файл закрыть
 # обязательно. Снимать лок в норме не надо, снимется сам при закрытии
 
 close($fh) or die "Error closing $path : $!";
 
 # Запись
 
 my $fh = new IO::File "> $path" or die "Cannot open $path : $!";
 
 # Требуем блокировку на запись
 
 flock($fh,LOCK_EX);
 
 # Для бинарного файла устанавливаем режим бинарного файла, остальное одинаково
 
 binmode($fh);
 
 ...
 # Успешность записи надо проверять
 print $fh $data or die "Write to $path failed: $!";
 ...
 
 close($fh) or die "Error closing $path : $!";
 
 -- 
 Artem Chuprina
 Communiware.net
 RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/358.49, ICQ: 13038757
 --- ifmail v.2.15dev5
  * Origin: Leninsky 45 home network (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Запись в файл и чтение из него   Michael Tsaruk   03 Mar 2002 13:27:27 
 Re: Запись в файл и чтение из него   Artem Chuprina   04 Mar 2002 14:47:44 
 Запись в файл и чтение из него   Michael Tsaruk   05 Mar 2002 17:52:53 
 Re: Запись в файл и чтение из него   Artem Chuprina   06 Mar 2002 12:12:47 
 Запись в файл и чтение из него   Aleksey Kotov   06 Mar 2002 19:56:57 
 Re: Запись в файл и чтение из него   Sergey Nepsha   06 Mar 2002 14:09:19 
 Re: Запись в файл и чтение из него   Pavel Ammosov   06 Mar 2002 20:22:12 
 Запись в файл и чтение из него   Aleksey Kotov   04 Mar 2002 18:24:21 
Архивное /ru.cgi.perl/635924ad3b97.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional