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.