manejo - perl read file
La forma más sencilla de abrir un archivo de texto y leerlo en una matriz con Perl (8)
Agregar una función estándar de abrir archivo Perl a cada script que tengo es un poco molesto:
sub openfile{
(my $filename) = @_;
open FILE,"$filename" or die $!;
my @lines = <FILE>;
return @lines;
}
y puedo crear un módulo Perl para hacer esto, pero esto es tan simple que estoy seguro de que ya debe haber uno.
Estoy tratando de encontrar una manera de leer un archivo de texto en una matriz, y no puedo encontrar un módulo Perl que pueda hacer esta simple tarea ... tal vez estoy buscando demasiado y ya vino con el instalación estándar 5.10.
De manera óptima, creo que se vería algo como esto:
my @lines = Module::File::Read("c:/some/folder/structure/file.txt");
Creo que esto es lo que estás buscando
Obtuviste las técnicas generales, pero quiero decir que Perl te desanima de hacerlo porque a menudo puedes hacer lo mismo que haces una línea por vez, que es intrínsecamente mucho más eficiente.
Tienes varias opciones, el método clásico do:
my @array = do {
open my $fh, "<", $filename
or die "could not open $filename: $!";
<$fh>;
};
El método IO :: All :
use IO::All;
my @array = io($filename)->slurp;
El método File :: Slurp :
use File::Slurp;
my @array = read_file($filename);
Y probablemente muchos más, después de todo TIMTOWTDI .
Para rápido y sucio, me gusta la simplicidad de la limpieza con @ARGV
.
# Ysth is right, it doesn''t automatically die; I need another line.
use 5.010;
use strict;
my @rows = do {
use warnings FATAL => ''inplace''; # oddly enough, this is the one. ??
@ARGV=''/a/file/somewhere'';
<>;
};
say q(Not gettin'' here.);
Si perl * no puede abrir el archivo, muere automáticamente.
* - el ejecutable, así que por favor no use mayúsculas.
También podría considerar utilizar Tie :: File, particularmente si está leyendo archivos más grandes y no quiere leer todo el archivo en la memoria. Es un módulo central. Además, consulte perlfaq5 .
Recomendaría un enfoque orientado a objetos que no requiera módulos fuera de la distribución CORE y funcionará en cualquier lugar:
use strict;
use warnings;
use IO::File;
my $fh = IO::File->new("< $file");
foreach ($fh->getlines) {
do_something($_);
}
$fh->close
También eche un vistazo a Perl6 :: Slurp que implementa la versión Perl6 de slurp y se recomienda en el libro "Perl Best Practices".
Algunos ejemplos....
my @lines = slurp ''filename'';
my @lines_chomped = slurp ''filename'', { chomp => 1 };
my @lines_utf8 = slurp ''filename'', { utf8 => 1 };