<?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:  Dando vueltas sobre lo mismo  </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>: Dando vueltas sobre lo mismo</h1>
	</td>

    <td align='right' valign='top'><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><a href='tutoperl4.html'> M&aacute;s dif&iacute;cil todav&iacute;a</a><br><a href='tutoperl6.html'> Ahorrando energ&iacute;as</a><br></td>
	</tr>
</table>

<h3>Bucles, lectura de teclado y ficheros</h3>



<P>Cuando, tras las elecciones, nuestro pol&iacute;tico corrupto sale reelegido
por m&eacute;ritos propios, viene inmediatamente la recuperaci&oacute;n
econ&oacute;mica y con ello el boom inmobiliario (favorecido por la recalificaci&oacute;n
en terrenos construibles de los parques de la ciudad). Tantas comisiones
tiene que calcular, que decide escribir un programa que lo haga continuamente,
en vez de tener que ejecutar el programa anterior cada vez. Decide adem&aacute;s
guardar detalles de todo en un fichero, que llevar&aacute; en un disquete
escondido en el collar del perro, para que, en caso de que lo investigue
una comisi&oacute;n del Congreso, pueda tirar de la manta tecnol&oacute;gicamente.
Saldr&iacute;a entonces algo como lo incluido en el listado siguiente:</p>

<table class=listado align=center cellspacing=0 border=0 cellpadding=1><tr><td
bgcolor=black><table  cellspacing=0 border=0 cellpadding=2 width=100%><tr><td bgcolor=white cellspacing=0 border=0 cellpadding=4><font size=+2>
<pre>
#<em>!/usr/bin/perl
</em><font color=red>open</font>( MANTA, "&gt;clientes");
<font color=blue>while</font>(1){
  <font color=red>print</font> "Cliente\n";
  <font color=red>chop</font>( <font color=green>$paganini</font> = &lt;STDIN&gt; );
  <font color=blue><font color=blue>last</font></font> <font color=blue>if</font> !<font color=green>$paganini</font>;
  <font color=red>print</font> "Valor inmueble\n";
  <font color=red>chop</font>( <font color=green>$valor</font>= &lt;STDIN&gt; );
  <font color=green>$comision</font> = <font color=green>$valor</font> * 0.25;
  <font color=red>print</font> "Comision = <font color=green>$comision</font>\n";
  <font color=red>print</font> MANTA "<font color=green>$paganini</font> <font color=green>$comision</font>\n";
}
<font color=red>close</font> MANTA;
</font></pre>
</td></tr></table></td></tr><caption><font face="arial,helvetica">Listado <script>multicontador(1);</script>: Programa manta.pl</font></caption></table>



<P>En este <a href='manta.pl.html'>segundo programa</a>, que llamaremos <code>manta.pl</code>,
se introducen algunos conceptos nuevos m&aacute;s. Para empezar, se utiliza
la orden <code>open</code> para abrir un fichero; a esta
orden se le dan dos par&aacute;metros, el <I>filehandle</I> por el cual
nos vamos a referir al fichero en lo sucesivo, y una cadena que incluye
el nombre del fichero y la forma de manejar ese fichero. En este caso,
se usa la expresi&oacute;n <code>">clientes"</code>, que
indica que se va a abrir para escritura. Otras opciones son las que aparecen
en la tabla 1. Si no se pone nada, se supone que el
fichero se abre para lectura. Y esto es fuente de continuas
confusiones.</p>

<p>Como siempre, hay Más de Una Forma de Hacerlo <sup>TM</sup>, aunque
no necesarimente más corta. Se puede meter el nombre del fichero en
una variable tal como <code>$MANTA</code>, y abrirlo de la forma
siguiente:</p><pre><code>
$MANTA='>prueba';
open MANTA;
</pre></code>
<p>Es decir, cuando no se pone una cadena detrás del
<em>filehandle</em>, se usa el contenido de una variable que tenga el
mismo nombre. Véase también que en este caso no he usado paréntesis
detrás de open; son opcionales. Hay muchas más cosas sobre open
leyendo el tutorial incluido en la documentaci&oacute;n, se accede a él
escribiendo <code>perldoc perlopentut</code> o  <code>man
perlopentut</code>.

<center><A NAME="_1_2"></A><TABLE align=right width=50% cellpadding=2 cellspacing=0 border=0>
    <tr><td bgcolor=blue><table cellspacing=0 cellpadding =6 width=100% border=0><tr>
<td bgcolor=white><table cols=2 width=100%><tr><td> &gt;</td><td> Abrir para escritura</td></tr>
<tr><td> &gt;&gt;</td><td>  Abrir para concatenar</td></tr>
<tr><td> &lt;</td><td> Abrir para lectura </td></tr>
<tr><td> &gt;+</td><td>  Abrir para lectura/escritura</td></tr>
<tr><td> ¦ orden </td><td>  Ejecutar un programa que filtrará lo que se imprima en el fichero.</td></tr>
<tr><td> orden | </td><td> Ejecutar una orden, de la cual se leerá la salida.
</td></tr></table></td></tr></table></td></tr><caption><font
face="arial,helvetica">Tabla <script>multicontador(2)</script>: Modos de apertura de ficheros</font></caption></table>
</center>

<P>A continuaci&oacute;n se comienza un bucle con la orden<code>while</code>,
que se ejecutar&aacute; mientras la expresi&oacute;n entre par&eacute;ntesis
sea cierta, o sea, en este caso, en principio, siempre. Los valores "verdaderos"
se indican en <strong>Perl</strong> con un n&uacute;mero distinto de 0 o una cadena no nula.
Tras <code>while </code>va siempre un bloque, que se comienza
y termina con llaves. Dado que es un bloque, y no la alternativa orden|bloque
(como sucede, por ejemplo, en el lenguaje C), se tendr&aacute;n que utilizar
siempre las llaves, aunque se trate de un solo comando. Tambi&eacute;n
se podr&iacute;a sustituir esta l&iacute;nea por <code>until(0)
{</code>que tendr&iacute;a exactamente el mismo significado (recuerda,
Hay M&aacute;s De Una Forma de Hacerlo). O por dos o tres formas m&aacute;s,
al menos.
</p>

<P>En la l&iacute;nea 4 se hacen dos cosas juntas: se asigna a una variable
lo que introduce el usuario, y a esta variable se le elimina el &uacute;ltimo
car&aacute;cter (<code>chop</code>, que significa <I>trocear</I>,
como en el chopped). Esto es necesario porque, a diferencia de otros lenguajes,
<strong>Perl</strong> incluye el retorno de carro en la cadena que lee. Lo eliminamos entonces
para que quede todo bonito.
</p>

<TABLE align=right width=40% cellpadding=2 cellspacing=0 border=0>
    <tr><td bgcolor=blue>
       <table cellspacing=0 cellpadding = 6 width=100% border=0><tr>
<td bgcolor=white><pre>ETIQUETA while (EXPR) BLOQUE
ETIQUETA while (EXPR) BLOQUE continue BLOQUE 
ETIQUETA for (EXPR;EXPR;EXPR) BLOQUE 
ETIQUETA foreach VAR (MATRIZ) BLOQUE
</td></tr></table></td></tr><caption><font face="arial,helvetica">Tabla <script>multicontador(2)</script>: Tipos de bucles en Perl</font></caption></table>

<p> En la <I>l&iacute;nea 5</I> se utiliza una construcci&oacute;n t&iacute;pica:</p>
<pre><strong>Perl</strong> <code>&lt;comando> &lt;condicional> &lt;condici&oacute;n></code>.</pre>
<p>En este caso, se sale del bucle (<code>last</code>) en caso
de que lo que se haya leido sea la cadena vac&iacute;a (recordad que previamente
hemos eliminado el retorno de carro). Esta l&iacute;nea se pod&iacute;a
haber sustituido por la siguiente<code>last unless $paganini;</code>que
tiene exactamente el mismo significado (<code>unless</code>
significa a menos que); en general, una sentencia en la que se utiliza
<code>if</code> con una expresi&oacute;n verdadera se puede
sustituir por otra en la que se utiliza <code>unless </code>con
la misma expresi&oacute;n negada. Otras expresiones que regulan bucles
son <code>next</code>, que ejecuta la iteraci&oacute;n siguiente
sin pasar por el resto de las &oacute;rdenes del bucle, y <code>redo</code>,
que vuelve a comenzar el bucle sin evaluar la condici&oacute;n.
</p>

<P><TABLE align=right width=50% cellpadding=2 cellspacing=0 border=0>
    <tr><td bgcolor=blue><table bgcolor=white cellspacing=0 cellpadding = 6><tr>
<td><table cols=2>
<tr><td>lt, gt, le, ge</td><td>Lexicográficamente menor, mayor, menor
e igual, mayor e igual</td></tr>
<tr><td>eq, ne</td><td>Igual, distinto</td></tr>
<tr><td>cmp</td><td>Comparaci&oacute;n de cadenas; devuelve -1, 0 o 1</td></tr>
<tr><td>x</td><td>Multiplicaci&oacute;n de cadenas "az"  x 2 eq  "azaz" 
</td></tr></table>
</td></tr></table></td></tr><caption><font
face="arial,helvetica">Tabla <script>multicontador(2)</script>: operadores de cadenas en
Perl</font></caption></table>

<P>En esta misma l&iacute;nea se usa el operador <code>!</code>,
de negaci&oacute;n. Este operador, como otros muchos, est&aacute;n sacados
directamente del lenguaje C, en general, los operadores en <strong>Perl</strong> son los
mismos que en C, y adem&aacute;s tienen la misma prioridad. Adem&aacute;s,
hay una serie de operadores espec&iacute;ficos para cadenas alfanum&eacute;ricas,
sacados m&aacute;s bien del FORTRAN, y otros para ficheros que se ver&aacute;n&nbsp; m&aacute;s
adelante.
</p>

<P>En la l&iacute;nea 10 se escribe en el fichero <code>MANTA</code>;
como se ve, simplemente se incluye el <I>filehandle</I> delante de la expresi&oacute;n
que se va a escribir. Para terminar, despu&eacute;s de concluir el bucle
se cierra el fichero.</p>

<P>Estos primeros programas nos permiten ya tener una idea de c&oacute;mo
funciona <strong>Perl</strong>. En realidad, salvo algunos asuntos menores de sintaxis de
variables y su declaraci&oacute;n, es muy similar al C: por eso siempre,
la primera aproximaci&oacute;n a un programa ser&aacute; hacerlo tal como uno
lo har&iacute;a en C, para luego, cuando se tenga mayor dominio del lenguaje
<strong>Perl</strong>, hacerlo de forma m&aacute;s perlera.</p>

<p>El político corrupto se da cuenta de que tiene en un fichero
guardadas una serie de sobornos anteriores en un fichero; pero no le
puso nombre; así que, antes de que se le vayan las cosas de la memoria 
y no diga nada salvo en presencia de su abogado, decide hacer un
programa que le vaya preguntando cantidad por cantidad quién fue la
que se la di&oacute;. Y decide hacer el siguiente programa (<a
href='recuerda.pl.html'><code>recuerda.pl</code></a>):

<table class=listado align=center cellspacing=0 border=0 cellpadding=1><tr><td
bgcolor=black><table cellspacing=0 border=0 cellpadding=2 width=100%><tr><td bgcolor=white cellspacing=0 border=0 cellpadding=4><font size=+2>
<pre><font size=+2>
1&nbsp;#<em>!/usr/bin/perl
</em>2&nbsp;
3&nbsp;<font color=red>open</font> FICHERO, "cantidades";
4&nbsp;<font color=red>open</font> SALIDA, "&gt;salida";
5&nbsp;<font color=blue>while</font>(<font color=green>$linea</font> = &lt;FICHERO&gt;) {
6&nbsp;  <font color=red>chop</font>(<font color=green>$linea</font>);
7&nbsp;  <font color=red>print</font> "Quien te ha dado <font color=green>$linea</font> pelas? Eh?\n";
8&nbsp;  <font color=red>chop</font>( <font color=green>$menda</font> = &lt;STDIN&gt; );
9&nbsp;  <font color=red>print</font> SALIDA "<font color=green>$menda</font> <font color=green>$linea</font>\n";
10&nbsp;}
11&nbsp;<font color=red>close</font> FICHERO;
12&nbsp;<font color=red>close</font> SALIDA;
</font></pre>

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


<p>Este programa utiliza las mismas estructuras que el anterior:
ficheros de entrada y salida, y un bucle. Sin embargo, se usan de
forma diferente. Para empezar, la sintaxis de apertura de los ficheros 
en las líneas 3 y 4 es diferente: se evitan los paréntesis, casi 4
bytes, que en una memoria de 512 megabytes, quieras que no, es un
ahorro. El fichero <code>cantidades</code> se abre para lectura, por
lo que no es necesario poner el símbolo &lt;, y el fichero
<code>salida</code> se abre para escritura.</p>

<p>Lo que sigue es bastante típico de la lectura de ficheros en Perl:
se lee una línea del fichero abierto (usando la construcci&oacute;n
<code>&lt;&gt;</code>, se asigna a la variable
<code>$line</code>. Además, la línea está dentro de una condici&oacute;n de
continuaci&oacute;n de un bucle; efectivamente, <code>$line</code> será la
cadena vacía, y por lo tanto falso, cuando el fichero deje de tener
elementos.</p>

<p>El interior del bucle no aporta nada nuevo: simplemente se le
eliminan los retornos de carro a lo que se lee usando
<code>chop</code>, y se combina la entrada con lo que introduce el
usuario para escribirlo en la salida. Finalmente, en las líneas 11 y
12, se cierran los ficheros.</p>

<table class=ejercicio width=100% cellpadding=2 cellspacing=0 border=0>
    <tr><td bgcolor=green><table width=100% bgcolor=white cellspacing=0 cellpadding = 6><tr>
<td><ol><li>Realizar un programa que vaya calculando cuadrados de n&uacute;meros hasta que se introduzca una línea en blanco (solo retorno de carro).</li>
<li> Realizar un programa que permita al usuario introducir un nombre, y el ordenador le escriba "Hola &gt;mismo nombre en may&uacute;sculas&lt;". </li> 
<li> Realizar un programa que solicite nombres y apellidos del
usuario, y los imprima en pantalla en  formato formal: apellidos y
nombre, separados por coma. Escribir en un fichero todos aquellos que
se llamen Juan de nombre.</li></ol>  
</td></tr></table></td></tr><caption><font face="arial,helvetica">Ejercicios <script>multicontador(3);</script></font></caption></table>





<TABLE  align=center cellpadding=5 bgcolor='darkseagreen'><tr><td>[<a href='tutoperl16.html'> Preguntas frecuentemente preguntadas</a>] [<a href='tutoperl17.html'> Bibliograf&iacute;a.</a>] [<a href='tutoperl18.html'> Recursos Internet</a>] [<a href='tutoperl4.html'> M&aacute;s dif&iacute;cil todav&iacute;a</a>] [<a href='tutoperl6.html'> Ahorrando energ&iacute;as</a>] </td></tr></table>

</BODY>
</HTML>
