• Publicidad

Bucle ¿infinito?

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Bucle ¿infinito?

Notapor Eowyn » 2012-05-22 05:56 @289

Hola,

estoy haciendo pruebas con un programa y no me devuelve nada, creo que entro en un bucle infinito y por más que miro no encuentro el porqué:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  my $indizea=0;
  2.         my $ADI=0;
  3.         my @ADIak = ('"wid="w1"', 'wid="w2"');                        # vector con dos string de prueba
  4.         my $lerroADI= 'wid="w2"';                                     # string que quiero buscar en el vector
  5.         while (($indizea<=scalar(ADIak))||($ADI=0)){                  # hasta que se acabe el vector o no lo encuentre
  6.                 if ((@ADIak[$indizea]) = $lerroADI =~ /wid="(.*?)"/){ # si lo encuentra...
  7.                         $ADI=1;
  8.                 }
  9.                 else {
  10.                         $indizea=$indizea+1;
  11.                 }
  12.         }
  13.         print ($ADI);
  14.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Podrían ayudarme, por favor?
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410

Publicidad

Re: Bucle ¿infinito?

Notapor explorer » 2012-05-22 07:06 @337

Tienes puesta esta condición:

($indizea<=scalar(ADIak)) || ($ADI=0)

Hay varios problemas...

1.- Estás poniendo scalar(ADIak), pero ADIak, *ahí*, es un literal, por lo que scalar() siempre devolverá 1 (y de aquí viene el bucle infinito).

2.- Cambiando el '||' por un 'or' puede ahorrarte algún paréntesis...

3.- Al final pones $ADI=0. Esto no es una comparación, sino una asignación, por lo que *siempre* estás poniendo $ADI al valor 0, no preguntando por qué valor tiene.

Solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         while ($indizea <= @ADIak  or  $ADI == 0) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

aunque yo reharía todo el bucle así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $ADI = 0;
  2. my @ADIak = ('"wid="w1"', 'wid="w2"');                        # vector con dos string de prueba
  3. my $lerroADI = 'wid="w2"';                                    # string que quiero buscar en el vector
  4.  
  5. for my $ADIak (@ADIak) {
  6.     if (($ADIak) = $lerroADI =~ /wid="(.*?)"/) {              # si lo encontramos...
  7.         $ADI = 1;
  8.         last;
  9.     }
  10. }
  11. print "$ADI\n";
  12.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De todas maneras... sospecho que hay algo raro... ¿seguro que quieres guardar en $ADIak el resultado de la captura de la expresión regular? ¿No será que solo quieres saber si $lerroADI contiene ese patrón?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Bucle ¿infinito?

Notapor Eowyn » 2012-05-23 02:37 @150

Lo cierto es que sí pretendía comparar patrones y no quería guardar nada.

Yo pretendo buscar el "lerroadi" dentro del vector: si lo encuentro, pongo ADI=1 y salgo del while, pero si no, el programa debe devolver 0. Por ello una estructura con "for" no me convenía, ya que el for me mirará todos los elementos cuando yo sólo quiero mirar los elementos hasta encontrar dicho patrón.

Aún probando su solución, me da un bucle infinito, ¿es por que no comparo nada y simplemente guardo un patrón? Gracias.
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410

Re: Bucle ¿infinito?

Notapor explorer » 2012-05-23 03:16 @178

Un bucle for() no puede ser el que provoca el bucle infinito, porque @ADIak es finito.
Y no, no recorremos todos los valores: en cuanto encontramos una coincidencia salimos con la ayuda de last.

Lo siguiente lo he probado, y funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @ADIak = ('"wid="w1"', 'wid="w2"');          # vector con dos cadenas de prueba
  2. my $lerroADI = 'wid="w2"';                      # cadena que quiero buscar en el vector
  3. my $aurkitu = 0;
  4. for my $ADI (@ADIak) {
  5.     if ($lerroADI eq $ADI) {
  6.         $aurkitu = 1;
  7.         last;                                   # salimos enseguida
  8.     }
  9. }
  10. if ($aurkitu) {
  11.      print "Encontrado\n";
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¡Ojo! Estoy buscando que $lerroADI sea, exactamente, igual a alguno de los elementos de @ADIak. Por eso uso 'eq' (igualdad de cadenas alfanuméricas).

En Perl un poco más moderno:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. my @ADIak = ('wid="w1"', 'wid="w2"');           # vector con dos cadenas de prueba
  4. my $lerroADI = 'wid="w1"';                      # cadena que quiero buscar en el vector
  5. if ($lerroADI ~~ @ADIak) {
  6.     print "Encontrado\n";
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Otro detalle: el primer elemento de @ADIak creo que tiene unas '"' demás (se las he quitado en el segundo ejemplo).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Bucle ¿infinito?

Notapor Eowyn » 2012-05-23 03:52 @203

Exactamente, es una respuesta perfecta.

Veo que por culpa mía y seguro que de alguno más comienzas a dominar la lengua vasca ($aurkitu) ¡ja,ja!.

Muchas gracias por todo.
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados