Lectura de fichero en Perl
Vamos con un ejemplo tonto de perl, sacar el contenido de un fichero por pantalla. Nos pasarán el nombre del fichero en la línea de comandos. Llamaremos cat.pl al programa. Su ejecución será así
$ ./cat.pl unfichero.txt contenido del fichero
El fichero cat.pl puede tener algo como esto
#! /usr/bin/perl $fichero=shift; open FICHERO, $fichero or die "No existe ".$fichero; while (<FICHERO>) { print $_; } close FICHERO;
Vamos a ver que es todo esto.
La primera línea, la del #! /usr/bin/perl como indicamos en el Hola Mundo en Perl es para poder ejecutar el comando directamente, sin necesidad de llamar al intérprete de perl. De alguna forma, en esta línea estamos indicando al sistema operativo qué programa debe usar para ejecutar este fichero.
Los parámetros de la línea de comandos se van obteniendo consecutivamente con shift. De esta forma, en la variable $fichero -no hace falta declararla-, se guardará el primer parámetro que se pase al comando cat.pl. Sucesivas llamadas a shift irían dando los siguientes parámetros que hubiera.
Con open FICHERO, $fichero se abre el fichero como lectura. Este open devolverá algo parecido a null/false si no se puede abrir, en cuyo caso se ejecutará la siguiente parte del or, que es un die "No existe ".$fichero. Este die hace que termine el programa mostrando la cadena que se pone detrás. La cadena es una cadena de texto concatenada con la variable que contiene el nombre del fichero. Para concatenar cadenas se usa el punto. Así, "no existe ".$fichero equivale a algo como "no existe unFichero.txt".
Para leer el fichero se hace un while (<FICHERO>). Cada llamada a <FICHERO> lee una línea completa del fichero, incluido el retorno de carro y la guarda en una variable especial de nombre $_
Cuando <FICHERO> devuelva null -o false-, se termina el bucle.
Para sacar por pantalla la línea, basta con un print $_;
Finalmente, cerramos el fichero con un close FICHERO;
Un pequeño detalle de perl es que hay muchas formas de hacer la misma cosa. Por ejemplo, se puede abrir el fichero al menos de estas dos formas
open FICHERO, $fichero; open (FICHERO, $fichero);
Podríamos leer de golpe todo el fichero y guardarlo en un array, así
# los arrays empiezan con @ en vez de $ @array = <FICHERO>;
y sacarlo todo por pantalla así
print @array;
o incluso podemos leer y escribir todo de golpe en una sola línea, sin usar el array.
print while (<FICHERO>);