← Perl EspañolChapter 04 of 13

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 →