<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE html
	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML>
<HEAD>
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=uft8">
   <META NAME="DATE" CONTENT="11/2/2003">
   <META NAME="Author" CONTENT="J. J. Merelo">
   <META NAME="Description" CONTENT="Tutorial de PERL en castellano, con ejemplos y ejercicios">
   <META NAME="Keywords" CONTENT="curso de perl, tutorial de perl, manual de perl, programacion"> 
   <TITLE>Tutorial de Perl:  El cofre de la sabiduría  </TITLE>
<script language="JavaScript">
var contador = 1;
var contadores= new Array;
function multicontador(  numero ) {
      if ( ! contadores[ numero ]  )
          contadores[ numero ] = 1;
      else
          contadores[numero ]++;
      document.write( contadores[numero] );
};

</script>
<link rel ='stylesheet' type = "text/css" href = "perl.css">
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#ffffff" LINK="#0000FF" VLINK="#551A8B" ALINK="#FF0000">
<TABLE  align=center cellpadding=5 bgcolor='darkseagreen'>
	<tr>

	<td>
			 <!-- Atomz.com Search HTML for Tutorial de PERL en castellano -->
	  <form method="get" action="http://search.atomz.com/search/">
	    <input size=25 name="sp-q"><br /><input type=submit value="Busca en el tutorial">
	    <input type=hidden name="sp-a" value="0002147b-sp00000001">
	  </form>
	</td>

	<td align='center'>
			<h1><a href='indice.html'>Tutorial de <strong>PERL</strong> en castellano </a>: El cofre de la sabiduría</h1>
	</td>

    <td align='right' valign='top'><a href='xml.htm'> ¿XML? ¡Pero si es muy simple!</a><br><a href='tutoperl16.html'> Preguntas frecuentemente preguntadas</a><br><a href='tutoperl17.html'> Bibliograf&iacute;a.</a><br><a href='tutoperl18.html'> Recursos Internet</a><br></td>
	</tr>
</table>

<h3>Como usar los módulos y librerías en programas en <strong>perl</strong></h3>



<span class=v5>[v5]</span>
<p>Como nuestro político corrupto<sup>TM</sup> ya es todo un guru de
<strong>perl</strong>, la secretaría de prensa del partido decide
encargarle el seguir en la Internet todos los sitios web que hablen
del Señor X, para luego poder así denunciar la conspiración
judeo-masónica-telefónica-mundial (o séase, de <a
href=http://www.elmundo.es target=_new>El Mundo</a>) en contra de la
democracia y de sus figuras más prominentes. Por eso, decide hacer un
programa que cuente todas las páginas en las que aparece la cadena
"Señor X"; así luego puede hacer un gráfico con su evolución y ver si
la cosa va a más o a menos. Decide usar el buscador <a
href=http://www.altavista.com target=_new>Altavista</a>, ver el número
de páginas que devuelve, e imprimirlo. Para ello, hace el siguiente
programa (<a href=altax.pl><code>altax.pl</code></a>):</p>

<table class=listado cellspacing=0 border=0 cellpadding=1><tr><td
bgcolor=black><table cellspacing=0 border=0 cellpadding=2 width=100%><tr><td bgcolor=white>
<pre><font size=+2>
1&nbsp;&nbsp;#<em>!/usr/bin/perl
</em>2&nbsp;&nbsp;
3&nbsp;&nbsp;<font color=red><font color=red><font color=red><font color=red>use</font></font></font></font> LWP::Simple;
4&nbsp;&nbsp;<font color=red><font color=red><font color=red><font color=red>use</font></font></font></font> URI::Escape;
5&nbsp;&nbsp;
6&nbsp;&nbsp;<font color=red><font color=red>my</font></font> <font color=green>$codedQuery</font> = uri_escape( '"Señor X"' );
7&nbsp;&nbsp;<font color=red><font color=red>my</font></font> <font color=green>$url</font>="http://www.altavista.com/cgi-bin/query?pg=q&amp;sc=on&amp;hl=on&amp;q=<font color=green>$codedQuery</font>&amp;kl=XX&amp;stype=stext&amp;search.x=27&amp;search.y=7";
8&nbsp;&nbsp;<font color=red>print</font> "Conectando a <font color=green>$url</font>\n";
9&nbsp;&nbsp;<font color=red><font color=red>my</font></font> <font color=green>$respuesta</font> = get( <font color=green>$url</font> );
10&nbsp;<font color=red><font color=red>my</font></font> (<font color=green>$encontrados</font>) = (<font color=green>$respuesta</font> =~ /\S+;(\d+) pages found/gs);
11&nbsp;<font color=red>print</font> "Encontradas <font color=green>$encontrados</font> respuestas\n";
</font></pre>

</td></tr></table></td></tr><caption><font
face="arial,helvetica">Listado <script>multicontador(1);</script>:
Programa altax.pl</font></caption></table>

<p>Este programa imprimiría algo así como</p><pre><code>
Conectando a http://www.altavista.com/cgi-bin/query?pg=q&sc=on&hl=on&q=%22Se%F1or%20X%22&kl=XX&stype=stext&search.x=27&search.y=7
Encontradas 49 respuestas
</code></pre>

<p>Este programa, tal cual, seguro que no funciona en un
ordenador. Usa un par de librerías (o "bibliotecas" para los
puristas), que no se encuentran en la instalación estándar de
<strong>PERL</strong>: la  <code> LWP::Simple</code> y la
<code>URI::Escape</code>. Lo primero que habrá que hacer es bajarse e
instalar estas páginas.</p>

<p>Si está uno en Windows, es bastante fácil. Con la instalación de
<strong>PERL</strong> viene un programa, <code>ppm</code>, que sirve
directamente para bajarse e instalar módulos. Simplemente tecleando
ppm, y luego </p><pre><code>
ppm> install  LWP::Simple
ppm> install  URI::Escape
</code></pre>
<p>el programa baja, compila si es necesario, y prueba los dos
módulos. A veces esto que parece tan simple no lo es, porque necesita
compiladores externos y otra serie de cosas, pero si hay suerte, todo
irá bien. Con <code>ppm</code> se pueden usar otras órdenes, tales como </p><pre><code>
ppm> search WWW
</code></pre>
<p>que dará una lista de todos los módulos que incluyan WWW en su
nombre. En este caso, además, las dos librerías vienen en un sólo
paquete, el libwww-perl, que se puede bajar uno sólo tecleando
<code>install libwww-perl</code></p>

<p>En Linux y otros Unixes, es un poco más complicado, pero no
mucho. Todos los módulos para <strong>PERL</strong> se crean y
empaquetan de una forma estándar. Tras localizarlos, habitualmente en
alguno de los <A HREF=HTTP://www.cpan.org target=_new>sitios CPAN
(http://www.cpan.org)</a>, se hace lo siguiente: </p><pre><code>
[yo@localhost tmp]# tar xvfz libwww-perl-5.47.tar.gz
libwww-perl-5.47/
libwww-perl-5.47/t/
<font face=arial,helvetica>(más cosas...)</font>
[yo@localhost tmp]# cd libwww-perl-5.47
[yo@localhost libwww-perl-5.47]# perl Makefile.PL
<font face=arial,helvetica>(aquí comprobará que todas las librerías que se necesitan previamente
están instaladas, y crea un Makefile)</font>
[yo@localhost libwww-perl-5.47]# make
[yo@localhost libwww-perl-5.47]# make install
<font face=arial,helvetica>(y también, si se quiere)</font>
[yo@localhost libwww-perl-5.47]# make test
</code></pre>
<p>En este caso, también se acaba antes bajándose, para empezar, el
módulo <code>CPAN.pm</code>, con el cual, tecleando <code>perl -MCPAN
-e shell;</code> tiene uno un entorno similar al que hemos mencionado
antes para Windows. Eso sí, para instalar algo hará falta, tanto en
este caso como en el anterior, ser superusuario.</p>

<p>Las librerías no sólo instalan el código, instalan también los
manuales correspondiente. En este caso, se puede consultar el manual
escribiendo <code>perldoc LWP</code>; y merece la pena hacerlo, porque
nos encontraremos muchas cosas interesantes. Como indicamos en la
sección sobre <a href=#seccion14>el zen del <strong>PERL</strong></a>,
merece la pena conocer bien las librerías antes de ponerse a hacer
cualquier cosa en <strong>PERL</strong>, porque en la mayoría de los
casos se encontrará con la mitad del trabajo hecho.</p>

<p>Además, en este caso las librerías son dos palabras separadas por
<code>::</code>; esto es porque los módulos están organizados en una
especie de jerarquía. Cada módulo puede estar dentro de una jerarquía
o no, dependiendo de lo que quiera el autor y dependiendo de su
funcionalidad. En este caso, <code>Simple</code> está dentro de LWP
(lib-www-perl), porque va de eso; pero hay muchas más de la misma
familia (por ejemplo, <code>LWP::UserAgent</code> un módulo más
flexible para bajarse páginas). Lo mismo ocurre con el otro módulo.</p>

<p>Ya que tenemos las librerías instaladas, podemos ir al
programa. Las dos líneas que empiezan por <code>use</code> importan
las librerías. En realidad, hacen algo más que eso: traen todos los
identificadores de la librería al espacio global de nombres, de forma
que podemos usar las subrutinas y variables de la librería como si
hubieran sido declaradas en el mismo programa. En realidad, en este
caso usamos sólo una función de cada librería, así que, para no
<em>contaminar</em> el espacio de nombres, podríamos haber
escrito</p><pre><code>
use LWP::Simple qw(get);
use URI::Escape qw(uri_escape);
</code></pre>
<P>con exactamente el mismo resultado. Esta expresión, aunque pueda
parecer un poco rara, usa el mecanismo <em>quote</em> del
<strong>PERL</strong>, que sirve para definir matrices, cadenas y
otras cosas sin necesidad de escribir demasiado; o séase, que se
ahorra uno comillas, comas y cosas por el estilo. <code>qw( a b
c)</code> equivaldría a <code>('a','b','c')</code>. Por supuesto, el
operador <code>qw</code> y todos los demás por el estilo (ver la
página de manual perlop) pueden usarse en cualquier punto del programa
<strong>PERL</strong>.</p>

<p>Hasta ahora, en realidad, no hemos hecho nada, salvo importar las
librerías; el programa de verdad empieza en la línea 6, que requiere
un poco de explicación. Usa la subrutina <code>uri_escape</code> del
módulo <code>URI::Escape</code>, que sirve para codificar cadenas que
incluyan caracteres no alfanuméricos de forma que se pueda incluir
dentro de un URL o dirección Web, tal como la que usan los
buscadores. En este caso, la cadena contiene espacios, comillas y la
letra ñ, que no puede ir tal cual en un URL. Por eso se codifica,
quedando así: <code>%22Se%F1or%20X%22</code>. Generalmente, cuando se
vayan a hacer peticiones a buscadores desde un programa, habrá que
hacer este tipo de codificación.</p>

<p>El URL que se va a solicitar se compone en la siguiente línea. El
único truco aquí es ver que la petición que se hace a Altavista va
dentro de la variable <code>q</code> (no tienes más que hacer una
búsqueda de cualquier palabra, y ver dónde aparece en el URL de la
respuesta); eso se puede ver mirando al código HTML de la página, si
no es demasiado complicado. En este caso, encontramos una línea HTML
que dice:</p><pre><quote>
&lt;input type=text name=q size=35 maxlength=800 value=""&gt;</quote></pre>
<p>con lo cual, se ve que la variable <code>q</code> es la que
contiene la petición del usuario. Algo similar se puede hacer en casi
todos los demás buscadores.</p>

<p>La dos líneas siguientes imprimen un mensaje, y se bajan
efectivamente el URL. La función <code>get</code> está sacada del
módulo <CODE>LWP::Simple</CODE>, y simplemente se baja una página y la
mete en una variable. También se puede imprimir usando
<code>getprint</code> o meterse en un fichero usando
<code>getstore</code>. Como siempre, más información escribiendo
<code>perldoc LWP::Simple</code>.

<p>Finalmente, usando expresiones regulares (¿recuerdas las
expresiones regulares? Mira en  <a href=#seccion9>Regularizando la
situación</a>) se extrae el número de páginas que se han encontrado, y
se imprime. Y nuestro político corrupto, finalment, comprueba que
últimamente ya casi ni se habla del tema.</p>

<p><table class=ejercicio width=100% cellpadding=2 cellspacing=0 border=0>
    <tr><td bgcolor=green><table bgcolor=white cellspacing=0 cellpadding = 6><tr>
<td><ol>
<li> Usando el módulo <code>Benchmark</code>, medir cuanto tarda en
ejecutarse el código anterior. Programar también una petición similar
para otro buscador, y comparar ambos resultados.  </li>
<li>Localizar una librería que sirva para hacer gráficos
bidimensionales en <strong>PERL</strong> (pista: es parte de la
jerarquía <code>Chart</code>), y usarla para hacer el histograma que se
propuso en el tercer ejercicio del <a href=#seccion6>bloque segundo</a>.
</ol>

</td></tr></table></td></tr><caption><font face="arial,helvetica">Ejercicios <script>multicontador(3);</script></font></caption></table>
<span class=v5>[/v5]</span>



<TABLE  align=center cellpadding=5 bgcolor='darkseagreen'><tr><td>[<a href='xml.htm'> ¿XML? ¡Pero si es muy simple!</a>] [<a href='tutoperl16.html'> Preguntas frecuentemente preguntadas</a>] [<a href='tutoperl17.html'> Bibliograf&iacute;a.</a>] [<a href='tutoperl18.html'> Recursos Internet</a>] </td></tr></table>

</BODY>
</HTML>
