Чтение строк из файла в обратном порядке на Perl
Библиотека функций для получения строк из файла в обратном порядке. Большие файлы съедает как семечку.
package OpenDB;
=head1 INFO
Библиотека функций для получения строк из файла в обратном порядке
Большие файлы съедает как семечку
Автор: Низовцев Алексей
E-mail: alex-niz(СБК)mail.ru
Использование:
use OpenDB;
my $db = new OpenDB('news.db') or die $!;
my $all_line = $db->{'all_line'}; # количество строк в файле
my @array = $db->ReadLine(11, 5); # Собирает массив из 5 строк начиная с 11-й из файла, тоесть возвращает 11, 12, 13, 14 и 15 строки, конечно если есть такие
$db->Close();
=cut
#####################################
use strict;
sub new {
my $class = bless { }, shift;
$class->{'file'} = shift;
open($class->{'db'}, "<$class->{'file'}") or return;
flock($class->{'db'}, 1) or return;
my $file = $class->{'db'};
while (<$file>) {}
$class->{'all_line'} = $.;
return $class;
}
#=============================================================
sub ReadLine {
my $class = shift;
my $start_line = shift;
my $all_line = shift;
if ($start_line < 1) {$start_line = 1}
if ($start_line > $class->{'all_line'}) {return}
if ($all_line eq 'all') {$all_line = $class->{'all_line'}}
if ($all_line < 1) {$all_line = 1}
seek ($class->{'db'}, 0, 0);
my @array;
my $start = $class->{'all_line'}-$start_line+1;
my $end = $class->{'all_line'}-$start_line+1-$all_line;
my $line = 0;
my $file = $class->{'db'};
while (<$file>) {
$line++;
if ($line > $start) {last}
if ($line > $end) {chomp ($_); push (@array, $_)}
}
return reverse @array;
}
#=============================================================
sub Close {
my $class = shift;
close($class->{'db'}) or return;
$class = ();
}
#=============================================================
sub AllLine {
my $class = shift;
return $class->{'all_line'};
}
1;