Estructuras de control y Funciones 


F. Javier García Castellano
Web: http://genura.ugr.es/~javi, Mail: javi@geneura.ugr.es
IndiceInicioPerl

(C) GeNeura Team
Web: http://geneura.ugr.es, Mail: todos@geneura.ugr.es

1.- Estructuras de control de flujo

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";
  }
  

2.- Funciones

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);
  }

3. Ejercicios

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.