Você está na página 1de 3

13.

Un ejemplo unificado: Consulta bibliogrfica


En esta seccin desarrollaremos un ejemplo que unifique todo los visto hasta el momento.
El ejemplo permitir hacer bsquedas sobre un archivo de texto que contiene la bibliografa del curso. Las bsquedas podrn ser por autor, ttulo
y ao.
El archivo que contiene toda la informacin es un texto no estructurado (texto plano), donde a penas se distinguen las partes por algunos signos
de puntuacin sin que aparentemente haya una forma sencilla de extraer la informacin.
[1] J. Glenn Brookshear, Computer Science: An Overview 11th Edition; Prentice Hall; January 31,
2011.
[2] Jacqueline D. Hamilton, CGI Programming 101: Programming Perl for the World Wide Web Second
Edition; http://www.cgi101.com/; 2004.
[3] Nick Parlante, Essential perl; http://cslibrary.stanford.edu/108/; 2002.
[4] Web-building tutorials; http://www.w3schools.com/; 2013.
Antes de empezar con la implementacin de la solucin necesitaremos una nueva estructura de datos que ser de gran utilidad.
13.1 Arreglos asociativos (Mapas)
Tambin conocidos como Diccionarios, Mapas o tablas Hash, los Arreglos asociativos, permiten relacionar una clave con un valor. Al estilo de
un diccionario donde a cada palabra (clave) se le asocia un significado(valor).
En cuanto a la sintaxis los arreglos asociativos se distinguen de los arreglos simples por el uso del smbolo %.
%dict = (
"bart" => "Yo no lo hice!",
"homer" => "Donnas",
"lisa" => "El significado de la vida?",
);
Es posible extraer valores usando las claves como ndices:
$string = $dict{"bart"};
Si una clave no existe se retorna el valor undef
$string = $dict{"marge"};
Tambin es posible cambiar el valor asociado a una clave
$dict{"homer"} = "Mmmm, scalars";
Es posible extraer todas las claves de un mapa:
@claves = (keys %dict);
Entonces el arreglo claves, contendr: ("homer", "lisa, "bart"). Sin ningn orden en especial. (La palabra Hash significa
desorden).
13.2 El formulario para la consulta.html
Para permitir que el usuario pueda hacer la consulta se usar el siguiente formulario
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="estilo.css">
<title>Consultas a la bibliografa</title>
</head>
<body>
<form action="cgi-bin/consulta.pl">
<fieldset>
<legend>Bsqueda biblogrfica por:</legend>
<select name="kind">
<option value="author"> autor <br>
<option value="title"> ttulo <br>
<option value="year"> ao <br>
</select>
<input type="text" name="keyword"><br>
<input type="submit" value="buscar">
</fieldset>
</form>
</body>

</html>
El cual captura dos datos:
1.

El campo de bsqueda: author, title o year, en la variable kind.

2.

El texto a buscar, en la variable keyword

El formulario usa la siguiente hoja de estilo.css:


body {
font: 75% georgia, sans-serif;
line-height: 1.88889;
color: #555753;
background-color: #b0c4de;
margin: 0;
padding: 0;
}
fieldset{ background-color: #6495ed; }
legend{
color: white;
background-color: #6495ed;
}
h1{color: blue;}
a:link {color:#FF0000;}
a:visited {color:#00FF00;}
a:hover {color:#FF00FF;}
a:active {color:#0000FF;}
13.3 El CGI consulta.pl
El CGI que procesa la consulta tendr el siguiente cdigo como rutina principal
#!/usr/bin/perl -wT
use CGI qw(:standard);
print "Content-type: text/html\n\n";
print <<HTML;
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="../estilo.css">
<title>Busquedas bibliogrficas de Programacin Web 1 </title>
</head>
<body>
HTML
$kind = param("kind");
$keyword = param("keyword");
if(!($kind eq "") && !($keyword eq "")){
open(IN,"../data/libros.txt") or die "<h1>ERROR: open file</h1>\n";
while($line = <IN>){
%dict = matchLine($line);
$value = $dict{$kind};
if (defined($value) && $value =~ /.*$keyword.*/){
print "<h1>Encontrado: $line</h1>\n";
$result = 1;
next; #break the loop
}
}
close(IN);
}
if(!defined($result)){
print "<h1>No encontrado</h1>\n";
}
print <<HTML;
Haga click <a href="../consulta.html">aqui</a> para regresar al formulario de bsqueda
</body>
</html>
HTML

El cdigo supone la existencia de la rutina matchLine, que recibe una lnea de texto y devuelve un arreglo asociativo.
# line, return a hash array.
sub matchLine{
%dict = ();
$line = $_[0];
if( $line =~ m/^\[([0-9]+)\] ((.+), )?(.+); ((.+)|(http.+));(.+)\.$/ ){
$dict{"number"} = $1;
#$2 include the colon
if(defined($3)){ #some items do not have author
$dict{"author"} = $3;
}
$dict{"title"} = $4;
$dict{"editor"} = $5;
#$6 is the same than $5, by option |
#$7 is the whole options
$dict{"year"} = $8;
}else{
print "<h1>Error matching a line: $line</h1>\n";
}
return %dict;
}
mysql> CREATE DATABASE prueba;
Query OK, 1 row affected (0.03 sec)

mysql> SHOW DATABASES;


+--------------------+
| Database

+--------------------+
| mysql

| prueba

| test

+--------------------+
mysql> USE prueba;
Database changed
mysql> USE prueba
Database changed
mysql> CREATE TABLE gente (nombre VARCHAR(40), fecha DATE);

mysql> SHOW TABLES;


+------------------+
| Tables_in_prueba |
+------------------+
| gente

+------------------+
mysql> CREATE TABLE ciudad1 (nombre CHAR(20) NOT NULL, poblacion INT NULL);

Você também pode gostar