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