2010-07-10 89 views

回答

7

讀線:

use File::ReadBackwards; 

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

我最初誤解了問題,以爲你想向後和向前閱讀,以交替的方式 - 這似乎更有趣。 :)

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->()); 
3

我最近使用PerlIO::reverse做了這個。我更喜歡PerlIO::reverse的IO層,而不是File::ReadBackwards提供的自定義對象或綁定句柄接口。

5

簡單,如果tac可用:自身

#! /usr/bin/perl 

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

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

print while <$fh>; 

運行:

$ ./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
+0

當文件是utf8編碼時,你知道如何使用這個解決方案嗎? – W3Coder 2015-08-11 16:39:28

+0

自己想想 - 如果其他人需要知道:...使用編碼; ... binmode STDOUT,':utf8'; ... print decode_utf8($ _)... – W3Coder 2015-08-12 06:30:49