2010-11-03 11 views
11

Duplicar posible:
What is the best way to slurp a file into a string in Perl?de archivos de lectura en la variable en Perl

¿Es este código una buena manera de leer el contenido de un archivo en una variable en Perl? Funciona, pero tengo curiosidad si hay una mejor práctica que debería estar usando.

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

Ese no es un buen código. Esto es mejor: 'abierto (mi $ fh," <: codificación (UTF-8) "," la vista ") || morir "no puede perderse: $!"; $ content = do {local $ /; <$fh>}; cerrar ($ fh) || fallecer "no puede rootear la vista: $!"; ' – tchrist

Respuesta

26

creo que la práctica común es algo como esto:

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

Usando 3 open argumento es más seguro. Usar el identificador de archivo como variable es cómo se debe usar en Perl moderno y usar local $/ restaura el valor inicial de $/ en el extremo del bloque, en lugar de su código codificado \n.

+1

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

2

Tenga en cuenta que si estás en un ambiente donde la instalación de módulos es posible, es posible que desee utilizar IO::All:

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

Algunas de las posibilidades se ponen un poco loco, pero también pueden ser muy útiles.

+0

Un módulo no estándar más un' 'truculento sobrecargado '' 'operador solo para leer un archivo, algo que cada programador de Perl debería poder hacer mientras duerme, parece que está yendo bastante lejos. – tchrist

+1

tchrist, la sobrecarga no es el problema, [combinando HTTP con acceso de archivo local a 'archivo de lectura de PHP '] (http://php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen) (sabemos lo abismal que resultó). Pero ¿por qué odiar a los módulos de CPAN? Son la ventaja de Perl, [es una tontería no jugarlo] (http://stackoverflow.com/q/3700037#3700066). Pero incluso yendo tan lejos para inventar un término de combate contra ellos, eso no puede ser bueno. – daxim

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

No estoy de acuerdo con cargar un módulo simplemente para abrir y leer un archivo. Poder abrir y leer archivos es una operación demasiado fundamental para no entender muy, muy bien. – tchrist

+15

No estoy de acuerdo con escribir infinitamente las mismas cinco líneas de código una y otra vez cuando uno más un módulo lo hagan. – Quentin

+4

Ni siquiera es un módulo estándar. Esto reduce la portabilidad del código. – tchrist