Dupliqué possible: strong>
Comment puis-je lire des lignes de la fin de fichier à Perl? p> blockQuote>Lisez d'abord la dernière ligne, puis le dernier mais un, etc. Le fichier est trop gros pour s'adapter à la mémoire. P>
3 Réponses :
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->() );
Il est important de noter que le fichier :: Readbackwards n'est pas un module de base. Voir: perdoc.perl.org/index-modules-f.html
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
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 ($ _) ...
Voir: Stackoverflow.com/Questtions/303053/... .
On dirait que vous implémentez la commande Trace UNIX à Perl ou similaire.