UNIDAD 6: REGISTROS Y ARCHIVOS DIRECTOS

TEMA PERL 3: GRABACION Y LECTURA DISCO

Como ya se menciono grabar y lectura de registros o estructuras a renglones o registros de archivos en disco.

Estos dos procesos son los casos mas comunes y frecuentes que se pueden realizar con un archivo de disco.

GRABACION DE UNA ESTRUCTURA A UN ARCHIVO EN DISCO

Prog30.pl

#! /usr/bin/perl -w
# usando modulo o libreria CGI
use CGI;
# creando el OBJETO de tipo CGI
$q = new CGI;
# mandando servidor los encabezados de la pagina html
print $q->header;
print $q->start_html();
# creando una form o ventana
print $q->startform();
print $q->hr();
print "CLAVE : ";
print $q->textfield('CLAVE','0', 5);
print $q->br();
print "NOMBRE :";
print $q->textfield('NOMBRE', '', 20);
print $q->br();
print "EDAD : ";
print $q->textfield('EDAD','', 5);
print $q->br();
# creando un submit button
print $q->submit('GRABAR');
# cerrando la forma
print $q->endform();
print $q->hr();
#cerrando html
print $q->end_html;
if ($q->param('GRABAR'))
{
$clave = $q->param('CLAVE');
$nombre = $q->param('NOMBRE');
$edad = $q->param('EDAD');
# abriendo archivo y grabando
open(ARCHIVO, ">> DATOS.DAT") || die "No se pudo abrir el archivo";
# recordar que la clave debe empezar en 0
# recordar crear y poner en 'A' campo de status ver bajas en unidad anterior
$bandera="A";
# recordar grabar registro con tamano fijo
print ARCHIVO pack("I A30 I A1", $clave, $nombre, $edad, $bandera);
# cerrando archivo
close(ARCHIVO);
$temp = $q->param('CLAVE');
print "REGISTRO $temp GRABADO" ;
};

corrida:

image272.jpg

La primera observacion es que se esta usando el “open()” en modo ”»”.

Se esta agregando un campo $bandera=“A” para resolver el problema de bajas, reestudiar el TEMA PERL de bajas en la unidad anterior de archivos secuenciales.

Recordar que las claves del registro deben coincidir con el numero de renglon del archivo, asi que la serie de claves en archivos random o directos es 0,1,2,3,4,,,n

La instrucion de grabacion es:

print ARCHIVO pack(“I A30 I A1”, $clave, $nombre, $edad, $bandera);

Se esta grabando normalmente con print ARCHIVO, excepto que se tienen que empacar los cuatro campos del registro, recordar que el registro debe tener siempre un tamano fijo, las claves usadas para empacar son:

A –> empaca strings y rellena con espacios

I –> empaca unsigned int y usa 4 bytes de almacenamiento

i –> empaca signed int y usa 4 bytes de almacenamiento

C –> empaca unsigned char y usa ? bytes de almacenamiento

l –> empaca signed long y usa 4 bytes de almacenamiento

L –> empaca unsigned long y usa 4 bytes de almacenamiento

f –> empaca float y usa 4 bytes de almacenamiento

d –> empaca double y usa 8 bytes de almacenamiento

En caso de ocupar conocer el tamano de un registro, pack() regresa la cantidad de bytes empacados, ejemplo;

$tamano=pack(“I A50”); –> debera regresar 54

LECTURA CONSULTA DESPLIEGUE DE REGISTROS

Prog31.pl

#! /usr/bin/perl -w
# usando modulo o libreria CGI
use CGI;
# creando el OBJETO de tipo CGI
$q = new CGI;
# mandando servidor los encabezados de la pagina html
print $q->header;
print $q->start_html();
# creando una form o ventana
print $q->startform();
# creando un submit button
print $q->submit('DESPLEGAR');
# cerrando la forma
print $q->endform();
#cerrando html
print $q->end_html;
if ( $q->param('DESPLEGAR')) {
print $q->hr();
# empezando una tabla html
print "<HTML><TABLE Border=10 CellPadding=5><TR>";
# construyendo los encabezados de la tabla
print "<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th bgcolor=Red>EDAD</th></TR>";
# abriendo archivo
open(ARCHIVO, "DATOS.DAT") || die "No se pudo abrir archivo";
while(!eof(ARCHIVO)){
# leyendo registro
read(ARCHIVO, $temporal, 39);
# desempacandolo
($clave, $nombre, $edad, $bandera) = unpack("I A30 I A1", $temporal);
if($bandera eq "A")
{ print "<TR><TD>"."$clave"."</TD><TD>"."$nombre"."</TD><TD>"."$edad"."</TD></TR>";};
}
print "</TABLE>";
close(ARCHIVO);
print $q->hr();
};

corrida:

image273.jpg

Se abrio en modo lectura open(ARCHIVO,”DATOS.DAT”);

Se usa un ciclo while(!eof) para recorrer todos los renglones del archivo.

Se usa read(ARCHIVO, $temporal, 39); para leer el registro empacado, observar que el registro se manda a una variable $temporal y ademas read() ocupa conocer cuantos bytes se deben leer, recordar que si no le atinan al tamano exacto del registro, les puse una nota al final del TEMA PERL anterior y estoy seguro que ya la estudiaron.

$temporal se tiene que desempacar (unpack()) y pasar los datos a las variables normales del registro.

Ya con las variables y sus datos se construye una tabla normal de HTML para desplegarla.

TAREAS PROGRAMACION PERL

1.- Cargar y Leer los archivos pedidos en el TEMA PERL anterior.

Politica de Privacidad