2010-11-03 12 views
11

Eventuali duplicati:
What is the best way to slurp a file into a string in Perl?file letto nella variabile in Perl

E 'questo codice un buon modo per leggere il contenuto di un file in una variabile in Perl? Funziona, ma sono curioso di sapere se c'è una pratica migliore che dovrei usare.

open INPUT, "input.txt"; 
undef $/; 
$content = <INPUT>; 
close INPUT; 
$/ = "\n"; 
+0

Questo non è un buon codice. Questo è meglio: 'open (my $ fh," <: encoding (UTF-8) "," input.text ") || die "non può aprire input.text: $!"; $ content = do {local $ /; <$fh>}; chiudi ($ fh) || die "non può chiudere input.text: $!"; ' – tchrist

risposta

26

Penso pratica comune è qualcosa di simile:

my $content; 
    open(my $fh, '<', $filename) or die "cannot open file $filename"; 
    { 
     local $/; 
     $content = <$fh>; 
    } 
    close($fh); 

Utilizzando 3 argomento open è più sicuro. L'utilizzo dell'handle di file come variabile è come dovrebbe essere usato nel moderno Perl e usando local $/ ripristina il valore iniziale di $/ alla fine del blocco, invece del codice originale \n.

+1

Vedere http://search.cpan.org/dist/File-Slurp/extras/slurp_article.pod –

2

Si noti che se ti trovi in ​​un ambiente in cui l'installazione dei moduli è possibile, si consiglia di utilizzare IO::All:

use IO::All; 
my $contents; 
io('file.txt') > $contents; 

Alcune delle possibilità ottenere un po 'folle, ma possono anche essere molto utile.

+0

Un modulo non standard più un sovraccarico tricks'> 'Operatore solo per leggere un file, qualcosa che ogni programmatore Perl dovrebbe essere in grado di fare nel sonno, sembra che stia andando molto oltre il limite. – tchrist

+1

tchrist, il sovraccarico non è il problema, [il conflitto di HTTP con l'accesso al file locale a un file readfile della PHP] (http://php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen) (sappiamo quanto è stato abissale). Ma perché l'odio sui moduli CPAN? Sono il vantaggio di Perl, [è sciocco non giocarlo] (http://stackoverflow.com/q/3700037#3700066). Ma anche andare così lontano per inventare un termine di combattimento contro di loro, non può essere buono. – daxim

12
use File::Slurp; 
my $content = read_file('input.txt') ; 
+2

Non sono d'accordo con il caricamento di un modulo semplicemente per aprire e leggere un file. Essere in grado di aprire e leggere i file è un'operazione troppo fondamentale per non capire molto, molto bene. – tchrist

+15

Non sono d'accordo scrivendo all'infinito le stesse cinque righe di codice più e più volte quando si eseguirà uno più un modulo. – Quentin

+4

Non è nemmeno un modulo standard. Ciò riduce la portabilità del codice. – tchrist