6
votes

Perl - lire une ligne de fichier par ligne dans l'ordre inverse

Dupliqué possible:
Comment puis-je lire des lignes de la fin de fichier à Perl?

Lisez d'abord la dernière ligne, puis le dernier mais un, etc. Le fichier est trop gros pour s'adapter à la mémoire.


2 commentaires

Voir: Stackoverflow.com/Questtions/303053/... .


On dirait que vous implémentez la commande Trace UNIX à Perl ou similaire.


3 Réponses :


7
votes

Lignes de lecture dans l'ordre inverse:

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


1 commentaires

Il est important de noter que le fichier :: Readbackwards n'est pas un module de base. Voir: perdoc.perl.org/index-modules-f.html




8
votes

simple si TAC code> est disponible:

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


2 commentaires

Savez-vous comment utiliser cette solution lorsque le fichier est codé UTF8?


Je me suis inscrit moi-même - au cas où d'autres doivent savoir: ... Utilisez un encode; ... binmode stdout, ': utf8'; ... Imprimer Decode_utF8 ($ _) ...