Como leer un archivo de texto en Perl

La tarea. Hay un archivo de texto. Necesita cargar su contenido en la variable escalar en Perl programa.

Esta tarea aparece bastante a menudo. Por ejemplo, este problema puede producirse para la lectura de archivos de configuración o pequeños archivos de datos. Si desea procesar un archivo grande, es mejor no utilizar este método, y utilizar el streaming de lectura de un archivo.

Solución. Utilizar la biblioteca de Path::Tiny

Lo más fácil y conveniente solución es utilizar Perl biblioteca Path::Tiny

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

use Path::Tiny;

my $file_name = 'a.txt';

my $content = path($file_name)->slurp_utf8();

print $content;

Aquí path('a.txt') , se crea un objeto de la clase Path::Tiny, y ->slurp_utf8() llama al método slurp_utf8 el objeto. El resultado en la variable $content aparece todo el contenido del archivo.

Es una buena solución, pero hay una fineza. La biblioteca Path::Tiny no va con Perl, es necesario apostar por separado. Normalmente, esto no causa problemas, pero en algunas situaciones, la solución no es adecuado.

Solución. Leer el archivo de las herramientas estándar de Perl

Esta solución no es tan cómodo como el uso de la biblioteca Path::Tiny, tienen que escribir más, pero no requiere la instalación de bibliotecas adicionales.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.txt';

my $content = '';

open FILE, '<', $file_name or die $!;

while (<FILE>) {
    $content .= $_;
}

print $content;

Con la ayuda de open , hemos creado el fichero хендлер FILE. Cuando se trabaja con open es importante utilizar tres argumentos y es muy importante escribir or die, y no || die. Continuar con while (<FILE>) corremos por todo el archivo línea por línea y recogemos todo el contenido en la variable $content.

Inicialmente, hemos asignado a la variable $content una cadena vacía ''. Esto se debe a que el código funcione correctamente en el caso de archivos en blanco (si no se asigna una cadena vacía, en el caso de un archivo vacío en la variable $content se undef).

La peligrosa decisión. Utilizar cat

He aquí otra manera de como se puede leer el contenido del archivo en una variable. Esta solución no requiere un esfuerzo adicional de las bibliotecas y no tener que escribir muchas líneas de código, pero es костыльное solución. Lo mejor de todo así que no se escribir. Lo único que se puede hacer es que en el proyecto no Path::Tany, va el trabajo activo y para la validación de otras partes del programa de forma rápida de obtener el código que lee el archivo. Pero en este caso, cerca de dejar un comentario # TODO y la primera oportunidad para eliminar este código.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.txt';

my $content = `cat $file_name`;

print $content;

¿Por qué es una mala decisión. En primer lugar, no hay control de errores. Si el archivo no existe, en la salida de error se muestra un mensaje de advertencia cat: asdf: No such file or directory, pero el programa va a ir más allá. En segundo lugar, esto no funciona si el nombre de archivo contiene un espacio. En tercer lugar, si el contenido de la variable $file_name recibimos desde el exterior existe la posibilidad de que allí sería algo así como a.txt; rm -rf / y además de leer el archivo de nuevo a cabo acciones que no son seguras.

Otros articulos