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


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Renat Araslanow                      2:5011/119.1   26 Apr 2003  13:23:47
 To : All
 Subject : чтение файла с конца
 -------------------------------------------------------------------------------- 
 
 
 вот модуль. в своё время написал чтобы попробовать в работе tied handle.
 использовать так:
     tie *FH, 'tied_file', $file_name, 2048;
 (последний параметр размер блока).
 
 package tied_file;
 use Fcntl;
 use strict;
 use warnings;
 sub TIEHANDLE
 {
     my ($class, $file, $buf_size) = @_;
     my $fh;
 
     #sysopen $fh, "$file", O_RDONLY or die "can't open $file: $!\n";
     open $fh, "< $file" or die "can't open $file: $!\n";
     binmode $fh;
 
     my $self = {
                  handle => $fh,
                  buf_size => $buf_size,
                  buffer => '',
                  seek_time => 0,
                  bytes_left => (stat($file))[7],
                  };
 
     bless $self, $class;
 
     $self->load_more_data();
 
     return $self;
 }
 
 sub load_more_data
 {
     my $self = shift;
 
     if( $self->{bytes_left} <= 0 )
     {
         return ($self->{buffer}) ? 1 : undef;
     }
 
     my $prev_data = $self->{buffer};
     my ($bytes_to_read, $whence, $position);
 
     $bytes_to_read = $self->{buf_size};
     $whence = 2;
     $position = -( $self->{buf_size} * (++$self->{seek_time}) );
 
     if( $self->{bytes_left} <= $self->{buf_size} )
     {
         ($bytes_to_read, $whence, $position) = ($self->{bytes_left}, 0, 0);
     }
 
     seek( $self->{handle}, $position, $whence ) or die "can't seek\n";
 
     my $bytes = read( $self->{handle}, $self->{buffer}, $bytes_to_read );
 
     if( $bytes != $bytes_to_read )
     {
         die "error in read() - $bytes\n"; #unless defined $bytes;
         #warn "not equal in read()\n";
     }
 
     $self->{bytes_left} -= $bytes;
     $self->{buffer} = $self->{buffer}.$prev_data;
     $self->{len} = length $self->{buffer};
     return 2;
 }
 
 sub READLINE
 {
     my $self = shift;
     my ($pos, $str);
 
 LET_IT_AGAIN:
     $pos = rindex $self->{buffer}, "\x0A", $self->{len} - 2;
 
     if( $pos != -1 )
     {
         $str = substr($self->{buffer}, $pos+1, $self->{len}-$pos, '');
         $self->{len} -= length $str;
     }
     else
     {
         my $ret = $self->load_more_data();
         if( defined $ret )
         {
             if($ret == 1)
             {
                 $str = $self->{buffer};
                 $self->{buffer} = '';
             }
             elsif($ret == 2)
             {
                 goto LET_IT_AGAIN;
             }
         }
         else
         {
             return $ret;
         }
     }
     #chomp $str;
     return $str;
 }
 
 sub UNTIE
 {
     close $_[0]->{handle};
 }
 
 sub DESTROY
 {
     &UNTIE;
 }
 
 1;
 --- [Преждевременная оптимизация -- корень всех зол Д. Кнут]
  * Origin: Чайник с программным управлениемЪ (2:5011/119.1)
 
 

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

 Тема:    Автор:    Дата:  
 чтение файла с конца   Renat Araslanow   26 Apr 2003 13:23:47 
Архивное /ru.perl/32783eaa3480.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional