Input output

[Perl] Entrada y salida de datos

Uno de los usos principales de Perl, al menos en sus inicios, es el procesamiento de ficheros de texto. En esta entrada vamos a ver cómo trabajar con ficheros desde un script en Perl.

Abrir un fichero

Lo primero que debemos hacer a la hora de trabajar con un fichero es abrirlo. Como otros lenguajes de programación, Perl no puede simplemente abrir un fichero cualquiera. Lo que debe hacer es pedirle al sistema operativo un interfaz entre el script y el mundo exterior (el archivo en cuestión). Para ello se crean filehandles (“manejadores” de ficheros) que se encargarán de trabajar con estos ficheros. El comando para abrir un fichero y crear un filehandle, es open, y su uso es tan sencillo como lo siguiente:

open(INPUT, "<", "input.txt");    # Sólo lectura
open(OUTPUT, ">", "output.txt");  # Permite escribir
open(LOGFILE, ">>", "my.log");    # Añadir al final del fichero

En el ejemplo anterior, el primer campo dentro de los paréntesis indica el nombre del filehandle (por convenio se utilizan las mayúsculas), y el tercero es el nombre del fichero en el sistema. El segundo nos indica el modo de apertura: < indica sólo lectura, > abre el fichero para usarlo como salida del script (todo lo que haya en él será sobreescrito con la nueva información), y >> sirve para añadir información al final del archivo (uso clásico de un fichero de log).

Al utilizar open, estamos solicitando al sistema operativo que abra el archivo, pero el OS puede negarse (no tenemos permisos, por ejemplo), o puede haber cualquier tipo de error (el fichero no existe, está corrupto…). Para filtrar este tipo de problemas, se usa el comando die, que puede capturar ese mensaje, y hacer que el script termine dando el motivo, y no dejando la ejecución en un estado inesperado. Por lo tanto, la forma recomendable de abrir los ficheros anteriores sería:

open INPUT, "< in.txt" or die "Error al abrir in.txt: $!";
open OUTPUT, "> out.txt" or die "Error al abrir out.txt: $!";
open LOGFILE,">> my.log" or die "Error al abrir my.log: $!";

Leer un fichero

Para leer un fichero, la forma más cómoda y sencilla de hacerlo es servirnos de los paréntesis angulares u operador diamante, como llaman en argot de Perl ( <> ).

my $line = ;
my @lines = ;

En este ejemplo, vemos dos formas de leer el fichero tratado por el filehandle INPUT. En la primera sentencia estamos utilizando una variable escalar, con lo que leeremos sólo una línea de texto. Mientras que en la segunda sentencia, el array se llenará con todo el contenido del fichero, una línea de texto en cada posición del array.

Sin embargo, es más común utilizar <> dentro de un bucle, para ir tratando cada línea conforme la vamos leyendo. En el siguiente ejemplo con while, cada ejecución del bucle, la variable por defecto de Perl, $_, tomará el valor de la nueva línea leída del fichero, y el bucle continúa hasta que se termina el fichero:

while () {
    print "La línea leída es: $_";
}

Escribir en un fichero

Hasta ahora en todos los ejemplos que hemos visto, hemos utilizado la función print para escribir por pantalla cualquier dato. Pues es esta misma función la que nos permite escribir en un fichero indicándole el filehandle que queremos utilizar. En realidad, al utilizar print sin ningún filehandle, lo que estamos haciendo es obligarle a utilizar el filehandle por defecto, que es STDOUT, la salida estándar o lo que es lo mismo, la consola o pantalla.

print STDERR "Error volcado a la salida de errores!! n";
print OUTPUT $record;
print LOGFILE $logmessage;

Cerrar un fichero

Para terminar correctamente de trabajar con los ficheros, debemos cerrarlos una vez hemos acabado de necesitarlos. Para ello, basta invocar al comando close con el nombre del filehandle:

close LOGFILE;

Entrada de datos por el usuario

En este apartado hemos visto cómo trabajar con ficheros de texto, pero en ocasiones podemos necesitar interactuar con el usuario, de forma que pueda tomar decisiones en puntos concretos del script.

Para poder leer información introducida por el usuario, podemos utilizar los filehandles. En este caso, utilizaremos un filehandle especial, STDIN, que se refiere a la entrada estándar del sistema, por defecto el teclado. Si unimos este filehandle, con el operador diamante, conseguiremos leer una línea de texto desde teclado, y poder volcarla en cualquier variable de nuestro script.

my $line = ;
chomp($line);
print "El usuario ha pulsado: $line n";

En este ejemplo, tan sólo hemos leído lo que haya escrito el usuario por teclado, y lo hemos impreso por pantalla, pero podríamos haberlo utilizado para elegir una función en un menú, para conocer la ruta de un fichero, o cualquier otra toma de decisión que se nos ocurra.

También hemos utilizado la función chomp, que se encarga de quitar el carácter especial n al final de la cadena, lo que facilita el tratamiento de la línea leída.


Imagen | Andy Piper en Flickr

Anuncio publicitario

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s