Ricerca…


La via manuale

open my $fh, '<', $filename
    or die "Could not open $filename for reading: $!";
my $contents = do { local $/; <$fh> };

Dopo aver aperto il file (leggi man perlio se vuoi leggere codifiche di file specifiche invece di byte non man perlio ), il trucco è nel blocco do : <$fh> , l'handle di file in un operatore diamond, restituisce un singolo record dal file . La variabile "input record separator" $/ specifica cosa sia un "record": per impostazione predefinita è impostato su un carattere di nuova riga, quindi "un record" significa "una singola riga". Poiché $/ è una variabile globale, local fa due cose: crea una copia locale temporanea di $/ che svanirà alla fine del blocco e gli dà il valore (non) undef (il "valore" che Perl dà alle variabili non inizializzate). Quando il separatore del record di input ha quel valore (non), l'operatore diamond restituirà l'intero file. (Considera l'intero file come una singola riga).

Usando do , puoi persino andare in giro aprendo manualmente un file. Per la lettura ripetuta di file,

sub readfile { do { local(@ARGV,$/) = $_[0]; <> } }
my $content = readfile($filename);

può essere utilizzato. Qui, un'altra variabile globale ( @ARGV ) è localizzata per simulare lo stesso processo utilizzato quando si avvia uno script perl con parametri. $/ è ancora undef , dato che l'array di fronte ad esso "mangia" tutti gli argomenti in arrivo. Successivamente, l'operatore diamond <> fornisce di nuovo un record definito da $/ (l'intero file) e ritorna dal blocco do , che a sua volta ritorna dal sub.

Il sub non ha una gestione esplicita degli errori, che è una cattiva pratica! Se si verifica un errore durante la lettura del file, riceverai undef come valore di ritorno, al contrario di una stringa vuota da un file vuoto.

Un altro svantaggio dell'ultimo codice è il fatto che non è possibile utilizzare PerlIO per codifiche di file diverse: si ottengono sempre byte non elaborati.

Percorso :: Piccolo

Usare l'idioma di The Manual Way più volte in uno script diventa presto noioso quindi potresti voler provare un modulo.

use Path::Tiny;
my $contents = path($filename)->slurp;

Puoi passare un'opzione binmode se hai bisogno di controllare codifiche di file, terminazioni di linea, ecc. - guarda l' man perlio :

my $contents = path($filename)->slurp( {binmode => ":encoding(UTF-8)"} );

Path::Tiny ha anche molte altre funzioni per gestire i file, quindi potrebbe essere una buona scelta.

File :: Slurper

Questo è un modulo minimalista che berra solo i file in variabili, nient'altro.

use File::Slurper 'read_text';
my $contents = read_text($filename);

read_text() accetta due parametri facoltativi per specificare la codifica del file e se le terminazioni di riga devono essere tradotte tra gli standard LF unixish o DOSAL CRLF:

my $contents = read_text($filename, 'UTF-8', 1);

File :: Slurp

Non usarlo Sebbene sia in circolazione da molto tempo ed è ancora il modulo che la maggior parte dei programmatori suggerirà, è rotto e non è probabile che venga risolto .

Slurping di un file in una variabile di array

open(my $fh, '<', "/some/path") or die $!;
my @ary = <$fh>;

Quando viene valutato nel contesto di un elenco, l'operatore diamond restituisce un elenco costituito da tutte le righe nel file (in questo caso, assegnando il risultato a un contesto di elenco di forniture dell'array). Il terminatore di riga viene mantenuto e può essere rimosso mediante chomping:

chomp(@ary); #removes line terminators from all the array elements.

File slurp in one-liner

Il separatore di record di input può essere specificato con -0 switch ( zero , non capitale O ). Prende un numero ottale o esadecimale come valore. Qualsiasi valore 0400 o superiore farà sì che Perl slurpi i file, ma per convenzione, il valore utilizzato per questo scopo è 0777 .

perl -0777 -e 'my $file = <>; print length($file)' input.txt

Andando oltre con il minimalismo, specificando l'opzione -n , Perl legge automaticamente ogni riga (nel nostro caso - l'intero file) in variabile $_ .

perl -0777 -ne 'print length($_)' input.txt


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow