![]() Estructuras de control y Funciones F. Javier García Castellano Web: http://genura.ugr.es/~javi, Mail: javi@geneura.ugr.es | ![]() ![]()
(C) GeNeura Team Web: http://geneura.ugr.es, Mail: todos@geneura.ugr.es |
Perl mantiene todas las estructuras de control de flujo que pueda tener cualquier otro lenguaje, pero con la peculariedad de que un bloque siempre debe ir entre llaves ({ }), aun cuando el bloque contenga un única sentencia.
Un resumen general de las estrucuturas de control de flujo es:
Donde EXPR es una expresión, BLOQUE es una sentecia o conjunto de estas encerrado entre llaves y SENTENCIA es una sola sentencia
Ejemplos de esctructuras de control:
#!/usr/bin/perl
for ($i=0; $i < 20; $i++)
{
$matriz[$i]="Elemento $i";
}
print "El último es $matriz[$#matriz]\n" if ($#matriz==19);
print "El último: $matriz[$#matriz]\n" unless ($#matriz!=19);
$i=0;
while ($matriz[$i] ne "Elemento 5")
{
print "Buscando \"Elemento 5\" y encontrado $matriz[$i]\n";
$i++;
}
if ($i==5)
{
print 'La variable $i es 5'."\n";
}
else
{
print 'La variable $i no es 5'."\n";
}
#Vamos a mostrar los elementos del array
foreach $elemento (@matriz)
{
print "$elemento\n";
}
#Creamos una tabla hash
%dias=("lunes",L,"martes",M,"miercoles",X,"jueves",J,"viernes",V,"sabado",S,"domingo",D);
#Y mostramos sus claves
foreach $clave (keys(%dias))
{
print "\%dias{".$clave."}=".$dias{$clave}."\n";
}
En Perl también se pueden definir funciones (o subrutinas para los más puristas), utilizando la siguiente sintaxis: sub NOMBRE BLOQUE. Viendo esto, podemos preguntarnos ¿dónde están los parámetros?. Los parámetros de una función están en el aray @_. ¿Y cómo se devuelven?. Pues con return como en casi todos los lenguajes de programación.
Ejemplo de función
#!/usr/bin/perl
$uno=23.34;
$dos=26.66;
#Llamamos a la función suma
$sum=suma($uno,$dos);
print "La suma de $uno + $dos es $sum\n";
#FUnción suma
sub suma
{
#Cogemos los parámetros
my ($primero,$segundo)=@_; #También se podría hacer con my $primero=shift(@_); my $segundo shift(@_)];
#Devolvemos el resultado
return ($primero+$segundo);
}
También podemos devolver más de un parámetro a la vez, pero tenemos que tenerlo en cuenta a la hora de recogerlo.
...
($uno,$dos,$tres)=ejemplo($parametros);
...
@salida=ejemplo($parametros);
...
sub ejemplo
{
...
return ($a,$b,$c);
}
Para pasar un array como parámetro a una función hay que convertirlo antes en una referencia y, posteriormente, en la función desreferenciarlo. Para obtener una referencia se utiliza la barra a la izquierda y para desreferenciarlo el símbolo del array.
Ejemplo de array como parámetro
#!/usr/bin/perl
for (my $i=0; $i<100; $i++)
{
$numeros[$i]=$i;
}
#Llamamos a la función maximo con una referencia a la matriz @numeros
$max=maximo(\@numeros);
print "El maximo de la matriz de $#numeros elementos es el $max\n";
#Función maximo
sub maximo
{
#Cogemos los parámetros
my ($uno)=@_;
#desreferenciamos
my @matriz=@$uno;
my $max=$matriz[0];
for (my $i=1; $i<=$#matriz; $i++)
{
$max=$matriz[$i] if ($matriz[$i] > $max);
}
#Devolvemos el resultado
return ($max);
}
Ejercicio: Haz un bucle que recorra el array de argumentos del script y que los muestre por pantalla.
Ejercicio: Rellenar mediante un bucle un array asociativo. Mostrar con un bucle foreach las claves y los contenidos.
Ejercicio: Rellenar mediante un bucle for un array normal. Mostrar con diferentes tipos de bucles (while, until, do.., while, do ... until) su contenido.
Ejercicio: Realizar una función que acepte tres números y devuelva el mayor de los tres.
Ejercicio: Modificar la anterior función para que devuelva los tres números ordenados.
Ejercicio: Modificar la anterior función para que reciba un array y devuelva el menor y el mayor.