Control de Flujo
## Objetivos de Aprendizaje
- Usar sentencias condicionales (if, unless)
- Trabajar con given-when (smart match)
- Dominar bucles (while, for, foreach)
- Controlar ejecucion de bucles (next, last, redo)
- Comprender etiquetas de bucles
## Sentencias if
### if Basico
```perl
use strict;
use warnings;
my $edad = 25;
if ($edad >= 18) {
print "Adulto\n";
}
```
### if-else
```perl
my $edad = 15;
if ($edad >= 18) {
print "Adulto\n";
} else {
print "Menor\n";
}
```
### elsif
```perl
my $puntuacion = 85;
if ($puntuacion >= 90) {
print "A\n";
} elsif ($puntuacion >= 80) {
print "B\n";
} elsif ($puntuacion >= 70) {
print "C\n";
} else {
print "F\n";
}
```
### Modificadores de Sentencia
```perl
use strict;
use warnings;
my $edad = 25;
print "Adulto\n" if $edad >= 18;
my $estado = $edad >= 18 ? "adulto" : "menor";
# Modificadores For/while
print "Valido" if $x > 0 && $x < 100;
```
## Sentencia unless
### unless Basico
```perl
use strict;
use warnings;
my $edad = 15;
unless ($edad >= 18) {
print "Menor - no puede votar\n";
}
```
### unless-else
```perl
my $password = "secreto";
unless ($password eq "secreto") {
print "Acceso denegado\n";
} else {
print "Acceso concedido\n";
}
```
## given-when (Smart Match)
### given-when Basico
```perl
use strict;
use warnings;
use 5.010; # Smart match requiere Perl 5.10+
my $nota = "B";
given ($nota) {
when ("A") { print "Excelente!\n" }
when ("B") { print "Bien!\n" }
when ("C") { print "Promedio\n" }
default { print "Necesita mejora\n" }
}
```
### Reglas de Smart Match
```perl
use 5.010;
my $num = 42;
given ($num) {
when ($_ == 42) { print "La respuesta\n" } # Igualdad numerica
when (/^\d+$/) { print "Parece un numero\n" } # Coincidencia con regex
when ([1, 2, 3]) { print "En lista\n" } # Arreglo contiene
when (\%hash) { print "Referencia a hash\n" } # Es ref hash
default { print "Desconocido\n" }
}
```
## Bucle while
### while Basico
```perl
use strict;
use warnings;
my $contador = 1;
while ($contador <= 5) {
print "Contador: $contador\n";
$contador++;
}
```
### do-while
```perl
my $contador = 1;
do {
print "Contador: $contador\n";
$contador++;
} while ($contador <= 5);
# Siempre se ejecuta al menos una vez
```
### while con each
```perl
my %edades = (
Alice => 30,
Bob => 25,
Carol => 35,
);
while (my ($nombre, $edad) = each %edades) {
print "$nombre tiene $edad anos\n";
}
```
## Bucle until
### until Basico
```perl
use strict;
use warnings;
my $contador = 1;
until ($contador > 5) {
print "Contador: $contador\n";
$contador++;
}
```
### do-until
```perl
my $contador = 1;
do {
print "Contador: $contador\n";
$contador++;
} until ($contador > 5);
```
## Bucle for
### for estilo C
```perl
use strict;
use warnings;
for (my $i = 0; $i < 5; $i++) {
print "i = $i\n";
}
# Estilo clasico
for (my $i = 0; $i <= $#arreglo; $i++) {
print $arreglo[$i];
}
```
### for infinito
```perl
for (;;) {
print "Para siempre...\n";
last if alguna_condicion();
}
```
## Bucle foreach
### foreach Basico
```perl
use strict;
use warnings;
my @colores = ("rojo", "verde", "azul");
foreach my $color (@colores) {
print "Color: $color\n";
}
```
### Variable Por Defecto $_
```perl
my @colores = ("rojo", "verde", "azul");
foreach (@colores) {
print "Color: $_\n";
}
# O usando postfijo
print $_ for @colores;
```
### Indices de Arreglo
```perl
my @colores = ("rojo", "verde", "azul");
foreach my $idx (0 .. $#colores) {
print "$idx: $colores[$idx]\n";
}
# O con each
while (my ($idx, $color) = each @colores) {
print "$idx: $color\n";
}
```
### Iteracion de Hash
```perl
my %datos = (
nombre => "Alice",
edad => 30,
ciudad => "Boston",
);
foreach my $clave (keys %datos) {
print "$clave => $datos{$clave}\n";
}
# Claves ordenadas
foreach my $clave (sort keys %datos) {
print "$clave => $datos{$clave}\n";
}
```
## Control de Bucle
### next (Saltar Iteracion)
```perl
use strict;
use warnings;
foreach my $i (1 .. 10) {
next if $i % 2 == 0; # Saltar numeros pares
print "$i ";
}
# Imprime: 1 3 5 7 9
```
### last (Salir del Bucle)
```perl
use strict;
use warnings;
foreach my $i (1 .. 100) {
if ($i == 10) {
print "Encontrado 10!\n";
last; # Salir del bucle
}
}
print "Hecho\n";
```
### redo (Reiniciar Iteracion)
```perl
use strict;
use warnings;
my $intentos = 0;
while ($intentos < 3) {
$intentos++;
print "Intento $intentos\n";
if (alguna_condicion()) {
redo; # Reiniciar esta iteracion
}
}
```
### Bloque continue
```perl
use strict;
use warnings;
my $contador = 0;
while ($contador < 5) {
print "Antes: $contador\n";
} continue {
$contador++;
print "Despues: $contador\n";
}
```
## Etiquetas de Bucle
### Bucles Nombrados
```perl
use strict;
use warnings;
EXTERNO: foreach my $i (1 .. 3) {
INTERNO: foreach my $j (1 .. 3) {
print "i=$i, j=$j\n";
last EXTERNO if $i == 2 && $j == 2;
}
}
```
## Flujo Condicional
### and/or para Control de Flujo
```perl
use strict;
use warnings;
# Abrir archivo o morir
open my $fh, "<", "archivo.txt" or die "No se puede abrir: $!";
# Procesar datos o saltar
$datos = obtener_datos() and procesar($datos);
# Establecer valor por defecto
my $valor = $entrada || "predeterminado";
# Encadenar operaciones
$obj->abrir()->leer()->cerrar();
```
### unless para Clausulas de Guardia
```perl
sub procesar {
my ($datos) = @_;
return unless defined $datos;
return if $datos eq "";
# Procesar...
}
```
## Resumen
- `if`/`elsif`/`else` para ramificacion condicional
- `unless` es `if` negado (si NO)
- `given-when` para coincidencia inteligente (Perl 5.10+)
- `while` ejecuta mientras la condicion sea verdadera
- `until` ejecuta hasta que la condicion sea verdadera
- `for` es estilo C con init/condicion/paso
- `foreach` itera sobre listas
- `next` salta a la siguiente iteracion
- `last` sale del bucle completamente
- `redo` reinicia la iteracion actual
- Las etiquetas de bucle permiten romper bucles externos
- Modificadores de sentencia (`if`, `unless`, `for`) para codigo conciso
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →