Domanda

Sto cercando di leggere un file che ha solo CR come delimitatore di riga. Sto utilizzando Mac OS X e Perl v.5.8.8. Questo script dovrebbe funzionare su tutte le piattaforme, per ogni tipo di linea di delimitazione (CR, LF, CRLF).

Il mio codice attuale è la seguente:

open(FILE, "test.txt");

while($record = <FILE>){
    print $record;
}

close(TEST);

Questa attualmente stampare solo l'ultima riga (o peggio). Cosa sta succedendo? Obvisously, vorrei non convertire il file. E 'possibile?

È stato utile?

Soluzione

È possibile impostare il delimitatore utilizzando la speciale $/ variabile:

local $/ = "\r" # CR, use "\r\n" for CRLF or "\n" for LF
my $line = <FILE>;

perldoc perlvar per ulteriori informazioni.

Un'altra soluzione che funziona con tutti i tipi di interruzione di linea sarebbe quella di trangugiare l'intero file in una sola volta e poi dividerlo in linee con una regex:

local $/ = undef;
my $content = <FILE>;
my @lines = split /\r\n|\n|\r/, $content;

Non si dovrebbe farlo con file molto grandi, però, come il file viene letto nella memoria completamente. Si noti che l'impostazione $ / al valore indefinito disabilita il delimitatore di riga, il che significa che tutto ciò che viene letto fino alla fine del file.

Altri suggerimenti

ho risolto un problema più generale che potrebbe essere utile qui:

Come fare il parsing file di grandi dimensioni linea per linea con qualsiasi linea delimitatore (CR / CRLF / LF), ma sconosciuto in precedenza.

'Big' mezzi di file che non è ok per leggere l'intero file in una variabile. Qui la funzione 'detectEndOfLine' prende il nome del file e restituisce '\ r' o '\ n', tutto ciò che è utilizzato per la linea che termina (è cercato '\ r' o '\ n' simbolo char-by-char a partire dal fine del file).

my $file = "test.txt";
local $/ = detectEndOfLine($file);
open(IN, $file) or die "Can't open file \"$file\" for reading: $!\n";
while(<IN>) {
    s/\r\n|\n|\r$//;
    print "$_\n";
}

sub detectEndOfLine {
    my $file = $_[0];
    my $size = -s $file;
    print "\"$size\"\n";

    open(IN, $file) or die "Can't open file \"$file\" for reading: $!\n";
    for(my $i = $size; $i >= 0; --$i) {
        seek(IN, $i, 0);
        $_ = <IN>;
        my $sym = substr($_, 0, 1);
        return $sym if( $sym eq "\n" or $sym eq "\r" );
    }
    return undef;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top