Ficheros de Texto como Listas

Una aproximación usual al tratamiento de un fichero (posiblemente de texto) en Perl consiste en cargar todo el fichero en memoria en un array para a continuación manipular el array. Esta aproximación no es adecuada si el fichero es de gran tamaño.

El módulo Perl Tie::File permite atar un fichero a un array de manera que las operaciones de lectura/escritura sobre el array se reflejan en el fichero:

$ cat -n tiearray.pl
 1  #!/usr/local/bin/perl -w
 2  use strict;
 3  use Tie::File;
 4
 5  my @array;
 6
 7  tie @array, 'Tie::File', 'introcomp.tex.old' or die "$!";
 8
 9  print "Línea 43: $array[42]\n"; # El array comienza en cero ...
10
11  my $n_recs = @array;
12
13  print "Número de líneas: $n_recs\n";
14
15  for (@array) {
16   s/\\section/\\SECTION/g;
17  }
18  print "Línea 1: $array[0]\n";
19
20  push @array, "Penúltima\n", "Última\n";
21  print "Última línea: $array[-1]\n";
22
23  for (@array) {
24   s/\\SECTION/\\section/g;
25  }
26  print "Línea 1: $array[0]\n";
27
28  untie @array;

El fichero completo no es cargado en memoria. La primera vez que se itera sobre el fichero se construye un índice conteniendo las desviaciones de cada uno de los registros del fichero. De esta manera los accesos subsiguientes pueden obtenerse de manera directa mediante un seek(). Además los registros accedidos se guardan en memoria. El tamaño de la cache puede ajustarse mediante el argumento memory del comando tie.

Al ejecutar este programa obtenemos una saldia similar a esta:

~/Lperl/src$ ./tiearray.pl
Línea 43: Looks good
Número de líneas: 2402
Línea 1: \SECTION{Las Bases}
Última línea: Última
Línea 1: \section{Las Bases}

Desafortunadamente, los cambios en el array (en particular inserciones y supresiones en medio del mismo) son costosos.

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19