Escritura de fichero en Perl

De ChuWiki

Ya hemos visto como leer un fichero en perl. Vamos ahora a hacer un script de perl que se comporte como un comando copy para ver cómo se escribe un fichero en perl.

El script perl puede ser como este

#! /usr/bin/perl

$fichero_origen=shift;
$fichero_destino=shift;

open FICHERO_ORIGEN, $fichero_origen or die "No existe $fichero_origen";
open FICHERO_DESTINO, ">$fichero_destino" or die "No se puede abrir $fichero_destino";

print FICHERO_DESTINO while (<FICHERO_ORIGEN>);

close FICHERO_ORIGEN;
close FICHERO_DESTINO;

La llamada al script desde línea de comandos podría ser

$ ./copy.pl fichero_origen.txt fichero_destino.txt

En primer lugar, en el código, se leen los dos parámetros que se hayan pasado en la línea de comandos. Sucesivas llamadas a shift nos irán devolviendo estos parámetros en orden.

Luego se abren los ficheros. El primero, de lectura, se abre de forma normal como indicamos en Lectura de fichero en Perl. El segundo, de escritura, se abre añadiendo un > delante del nombre del fichero. Es decir, sería algo como esto

open FICHERO_DESTINO, ">fichero_destino.txt";

Sin embargo, en perl, dentro de una cadena, se sustituyen las variables por su contenido, por ello ">$fichero_destino" sustituye la variable $fichero_destino por su contenido, que es el nombre de fichero que queremos como fichero de salida.

Si pusieramos dos >>, entonces se escribiría en el fichero añadiendo al final del mismo. Un solo > sobreescribe el fichero si existe, borrando el contenido previo.

# sobreescribe el fichero
open FICHERO_DESTINO, ">fichero_destino.txt";

# Añade al final del fichero si existe
open FICHERO_DESTINO, ">>fichero_destino.txt";

Finalmente, el bucle, de una forma un poco enrevesada. Lo siguiente escribiría una línea de texto en el fichero, con el retorno de carro al final.

print FICHERO_DESTINO "una linea de texto\n";

Sin embargo, podemos poner directamente el bucle de lectura del fichero de entrada

while (<FICHERO_ENTRADA>)

en el print, así

 print FICHERO_DESTINO while (<FICHERO_ENTRADA>);

con lo que se irán leyendo las líneas del fichero de entrada y escribiéndose en el de salida.

Finalmente se cierran los ficheros con close.

Podemos hacer esto mismo, de una forma más "tradicional", así

#! /usr/bin/perl
$fichero_origen=shift;
$fichero_destino=shift;

open FICHERO_ORIGEN, $fichero_origen or die "No existe $fichero_origen";
open FICHERO_DESTINO, ">$fichero_destino" or die "No se puede abrir $fichero_destino";

while (<FICHERO_ORIGEN>)
{
   print FICHERO_DESTINO $_;
}

close FICHERO_ORIGEN;
close FICHERO_DESTINO;

en el que el bucle se ve de una forma más normal. Recuerda que en la variable especial $_ se guarda la última línea leída del fichero.

Enlaces externos[editar]