开发者

Perl - reading a file line by line in reverse order [duplicate]

开发者 https://www.devze.com 2023-01-06 13:21 出处:网络
This question already has answers here: Closed 12 years ago. Possible Duplicate: How can I read lines from the end of file in Perl?
This question already has answers here: Closed 12 years ago.

Possible Duplicate:

How can I read lines from the end of file in Perl?

First read t开发者_运维技巧he last line, and then the last but one, etc. The file is too big to fit into memory.


Reading lines in reverse order:

use File::ReadBackwards;

my $back = File::ReadBackwards->new(shift @ARGV) or die $!;
print while defined( $_ = $back->readline );

I misread the question initially and thought you wanted to read backward and forward, in alternating fashion -- which seems more interesting. :)

use strict;
use warnings;
use File::ReadBackwards ;

sub read_forward_and_backward {
    # Takes a file name and a true/false value.
    # If true, the first line returned will be from end of file.
    my ($file_name, $read_from_tail) = @_;

    # Get our file handles.
    my $back = File::ReadBackwards->new($file_name) or die $!;
    open my $forw, '<', $file_name or die $!;

    # Return an iterator.
    my $line;    
    return sub {
        return if $back->tell <= tell($forw);
        $line = $read_from_tail ? $back->readline : <$forw>;
        $read_from_tail = not $read_from_tail;
        return $line;
    }

}

# Usage.    
my $iter = read_forward_and_backward(@ARGV);
print while defined( $_ = $iter->() );


Simple if tac is available:

#! /usr/bin/perl

use warnings;
no warnings 'exec';
use strict;

open my $fh, "-|", "tac", @ARGV
  or die "$0: spawn tac failed: $!";

print while <$fh>;

Run on itself:

$ ./readrev readrev
print while <$fh>;

  or die "$0: spawn tac failed: $!";
open my $fh, "-|", "tac", @ARGV

use strict;
no warnings 'exec';
use warnings;

#! /usr/bin/perl


I've used PerlIO::reverse for doing this recently. I prefer the IO layer of PerlIO::reverse over the custom object or tied handle interface offered by File::ReadBackwards.

0

精彩评论

暂无评论...
验证码 换一张
取 消