|
|
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)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/32783eaa3480.html, оценка из 5, голосов 10
|