![]() 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.