Programación en Perl/Estructuras de control

Tipos de datos
Tema anterior

Estructuras de control
Índice

Subrutinas
Siguiente tema


Estructuras de control editar

Perl tiene varias clases de estructuras de control.

  • Control de ciclos: do, while, for, foreach, continue.
  • Control de sentencias: if, else, unless, until, elsif.
  • Control de flujo: goto, elsif, next, last, redo, return.

Para varias sentencias editar

Tiene estructuras de control orientado al bloque, similar a las de los lenguajes de programación C y Java.

  • Las CONDICIONES están rodeadas por paréntesis () y
  • Los BLOQUES rodeados por llaves {}
  • Las expresiones opcionales por corchetes cuadrados []
  • Las ETIQUETAS deben llevar al final dos puntos ':';

[ETIQUETA] while CONDICION BLOQUE [continue BLOQUE ]
[ETIQUETA] until CONDICION BLOQUE [continue BLOQUE ]
[ETIQUETA] foreach [VARIABLE] (LISTA) BLOQUE [continue BLOQUE]
[ETIQUETA] for (EXPRESION_1;EXPRESION_2;EXPRESION_3) BLOQUE
if CONDICION BLOQUE [[elsif BLOQUE] else BLOQUE]
unless CONDICION BLOQUE [else BLOQUE]

Donde EXPRESION_1 es la expresion inicial, EXPRESION_2 la condicion y la EXPRESION_3 es la expresion incremental.

Para una sola sentencia editar

Cuando se controla a una sola declaración, los modificadores de declaración proporcionan una sintaxis más ligera:

DECLARACIÓN if CONDICIÓN
DECLARACIÓN unless CONDICIÓN
DECLARACIÓN while CONDICIÓN
DECLARACIÓN until CONDICIÓN
DECLARACIÓN foreach LISTA

Donde DECLARACIÓN es una instrucción, llamada a alguna funcion, etc. y en estos casos la CONDICIÓN en vez de estar rodeado por parentesis requiere un punto y coma al final de la condición.

Operadores lógicos editar

Los operadores lógicos se utilizan para construir la CONDICIÓN en una estructura de control.

EXPRESION1 and EXPRESION2;
EXPRESION1 or EXPRESION2;
EXPRESION1 && EXPRESION2;
EXPRESION1 || EXPRESION2;
EXPRESION1 eq EXPRESION2;
EXPRESION1 == EXPRESION2;

Donde EXPRESION1 y EXPRESION2 son variables a comparar o 'expresiones' boleanas(verdadero o falso) según el contexto en que se use.

Operador triario editar

Una expresion que resume la sentencia if CONDICION BLOQUE else BLOQUE es:

[DECLARACION] [(] CONDICIÓN ? EXPRESION_1 : EXPRESION_2 [)];

Donde la EXPRESION_1 es el valor devuelto si la CONDICIÓN es verdadera.

Control de flujo editar

Las palabras clave de control de flujo next, last, return y redo son expresiones, por lo que pueden ser usadas con los operadores cortocircuito.

Construcciones para ciclos editar

Perl también tiene dos construcciones implícitas para bucles:

resultados = grep { ... } lista
resultados = map  { ... } lista

grep devuelve todos los elementos de lista en que el bloque subordinado evalúa a verdadero. map evalúa el bloque subordinado por cada elemento de lista y devuelve una lista de los valores resultantes. Estas construcciones permiten un estilo simple de programación funcional.

No hay declaración switch (salto multi-camino) en Perl 5. La documentación Perl describe media docena de formas de conseguir el mismo efecto usando otras estructuras de control. Existe sin embargo un módulo Switch, que proporciona la funcionalidad modelada para el próximo Perl 6.

Excentricidades para el control de flujo editar

Perl incluye una declaración goto etiqueta, pero es usada raramente. Las situaciones donde en otros lenguajes se utiliza goto no ocurren tan a menudo en Perl debido a sus amplias opciones de control de flujo.

Existe también una declaración goto &sub que realiza una llamada 'final'. Termina la subrutina actual e inmediatamente llama a la sub especificada. Esto se usa en situaciones donde una nueva subrutina puede realizar una gestión de la pila más eficiente que el propio Perl (porque típicamente no se requiere ningún cambio en la pila actual), y en una recursión muy profunda este tipo de llamadas puede tener un sustancial impacto positivo en el funcionamiento porque evita la sobrecarga de la gestión contexto/pila en el momento de retornar.

Ejemplos editar

Los siguientes apartados son ejemplo de como usar las sentencias de control en Perl.

For editar

# Imprime los valores que toma $i, desde 0 hasta 99
for($i = 0; $i < 100; $i++){
   print "$i\n";
}
# Cuando $i es igual a 100 la expresion '$i < 100' se
# evalua como falsa y el bucle termina


# Imprime una lista de nombres
@amigos = ('Julia', 'Luis', 'Mateo', 'Maria');
$na = @amigos;
for($i = 0; $i < $na; $i++)
{
   print "$amigos[$i]\n";
}

Foreach editar

# El ejemplo anterior escrito de forma más consisa 
@amigos = ('Julia', 'Luis', 'Mateo', 'Maria');
print "$_\n" foreach(@amigos);

@array = (23,35,'rosas','rojas',3,'5 numeros');
# Recorre todos los valores de la lista.
foreach(@array){
   print $_; # Imprime el valore almacenado.
}

If editar

$numero = 5;
# Evalua $numero.
if($numero == 5){
   print 'Hola mundo';
}

$numero = 'hola';
print 'Hola mundo' if $numero eq 'hola';
print 'cruel' if $numero;

# Analiza las siguientes sentencias, 
# persiguen el mismo resultado.
$numero = 0;
print 'nunca deberia imprimir este texto' if $numero;
print 'esta si se imprimira' if ! $numero;

if($numero){
   print 'nunca deberia imprimir este texto';
}elsif($numero == 5){
   print 'este texto tampoco se imprimira';
}else{
   print 'esta si se imprimira';
}

print ($numero?'nunca deberia imprimir este texto':'esta si se imprimira');


Tipos de datos
Tema anterior

Estructuras de control
Índice

Subrutinas
Siguiente tema