Чтение строк из файла в обратном порядке на 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;

Поделиться: