• Publicidad

Búsqueda en arrays

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

Búsqueda en arrays

Notapor davacro » 2011-07-04 16:41 @737

Hola a todos, soy nuevo en el foro y apenas llevo unos días utilizando Perl. Por lo regular, investigo y pruebo, hasta más no poder pero esta vez estoy contra el reloj. Tengo que ingresar ciertos datos para formar arrays en un archivo, luego ingresar alguno de los datos y que me muestre el array donde se encuentra. El problema es que cuando lo encuentra me muestra todo los arrays que ingresé. Aquí está esa parte del código. Gracias por cualquier ayuda que puedan darme.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. system("cls");
  2. print "Ingrese Codigo:\n";
  3. $in = <STDIN>;
  4. push( @datos, $in );
  5. print "Ingrese Marca:\n";
  6. $in = <STDIN>;
  7. push( @datos, $in );
  8. print "Ingrese descripcion:\n";
  9. $in = <STDIN>;
  10. push( @datos, $in );
  11. print "Ingrese Precio:\n";
  12. $in = <STDIN>;
  13. push( @datos, $in );
  14. print "Ingrese Cantidad:\n";
  15. $in = <STDIN>;
  16. push( @datos, $in );
  17. @registro = join( " ", @datos );
  18. open( ARCHIVO, ">>archivo.txt" );
  19.  
  20. foreach $campo (@registro) {
  21.     print ARCHIVO $campo;
  22. }
  23. print ARCHIVO"\n";
  24. close(archivo);
  25. system("cls");
  26. print "Ingrese la descripcion del producto que desea buscar:\n";
  27. $descripcion = <STDIN>;
  28. chop($descripcion);
  29. open( ARCHIVO, "archivo.txt" );
  30. @registro = <ARCHIVO>;
  31.  
  32. foreach $archivo (@registro) {
  33.     print $archivo;
  34.     if ( $descripcion == $archivo ) {
  35.         print "Si existe\n";
  36.         print "@registro";
  37.         last;
  38.     }
  39.     else {
  40.         system("cls");
  41.         print "No existe\n";
  42.     }
  43. }
  44. print "enter para ir al menu principal";
  45. $salir = <STDIN>;
  46.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-07-04 17:01 @751, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
davacro
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-07-04 16:20 @722

Publicidad

Re: Búsqueda en arrays

Notapor explorer » 2011-07-04 17:21 @764

Bienvenido a los foros de Perl en español, davacro.

La primera parte del programa se encarga de leer un registro y agregarlo a la "base de datos". Y la segunda parte, buscar por uno de ellos.

Veo varias cosas...

* No quitas los caracteres retorno de carro, por lo que no podrás grabar un registro por línea, como pretendes. Debes hacer un chomp() de los datos. Algo así:

print "Ingrese Código:\n";
chomp($in = <STDIN>);

* La línea 17 es incorrecta: join() devuelve un escalar, no una lista de valores. Lo correcto es:

$registro = join( " ", @datos );

* Por el mismo motivo, no tiene sentido recorrer los valores de @registro, porque solo hay uno. Lo correcto en las líneas 20 a 23 es cambiarlas por una sola:

print ARCHIVO "$registro\n";

* Como parece que estás en Windows, en la línea 28 es más correcto poner chomp() que chop() (por si acaso)

* La línea 33 sobra.

* La línea 34 es un error: quieres hacer una comparación de cadenas de caracteres, no una comparación numérica. Estás usando el operador de comparación de igualdad numérica (==), cuando deberías estar usando el de comparación alfanumérica (eq). Pero... el problema es que entonces el usuario del programa debería (en $descripcion) haber escrito un registro igual al que estamos buscando. Seguramente querrás que el usuario solo tenga que meter el código, o cualquier parte del registro, para sacar los registros que coinciden con esa búsqueda.

Yo cambiaría la condición de la 34 por una expresión regular:

if ( $archivo =~ /$descripcion/ ) {

de esta manera, estamos buscando $descripcion (lo que nos ha pedido buscar el usuario) dentro del $archivo (cada elemento de @registro).

* En el caso de que lo encuentre, en la línea 36, estás sacando todos los registros (fueron leídos todos de golpe en la línea 30). Esa línea la debes cambiar a

print "$archivo\n";

* Hay un problema en el else de la línea 39: se cumplirá por cada registro que no coincida con la búsqueda. Esa no es su misión. Lo que queremos es que salga un aviso cuando, después de mirar todos los registros, sepamos que no hemos encontrado ninguno correcto. Esto lo puedes resolver, poniendo alguna bandera, para que, cuando termine el bucle, si esa bandera no está puesta, saque el mensaje de error.

¡Adelante!
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: Búsqueda en arrays

Notapor davacro » 2011-07-04 21:30 @937

Gracias por ayudarme amigo, y me encanta cuando encuentro tanta información en un solo lugar, en serio, qué buen sitio este. Hice casi todos los cambios (como los entendí) que dijiste y ya crea el archivo en líneas y no columnas pero cuando los crea también crea el anterior otra vez, por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
"Array1"
"Array1  Array2"
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y así sucesivamente. También cuando los encuentra imprime todos los anteriores a los que busca.
Lo de poner una bandera en el "else" no lo entendí.
De nuevo, gracias por tomarte el tiempo de leer mi código y ayudarme, espero algún día ayudar a otros de la misma forma.
Sintáxis: [ Descargar ] [ Ocultar ]
  1. print "Ingrese Código:\n"; 
  2.         chomp($in = <STDIN>); 
  3.         push(@datos,$in); 
  4.         print "Ingrese Marca:\n"; 
  5.         chomp($in = <STDIN>); 
  6.         push(@datos,$in); 
  7.         print "Ingrese descripción:\n"; 
  8.         chomp($in = <STDIN>); 
  9.         push(@datos,$in); 
  10.         print "Ingrese Precio:\n"; 
  11.         chomp($in = <STDIN>); 
  12.         push(@datos,$in); 
  13.         print "Ingrese Cantidad:\n"; 
  14.         chomp($in = <STDIN>); 
  15.         push(@datos,$in); 
  16.         $registro = join(" ",@datos); 
  17.         open(ARCHIVO,">>archivo.txt"); 
  18.         print ARCHIVO "$registro\n"; 
  19.         close(archivo); 
  20.  
  21.         system("cls"); 
  22.         print "Ingrese la descripción del producto que desea buscar:\n"; 
  23.         $descripcion = <STDIN>; 
  24.         chop($descripcion); 
  25.         open(ARCHIVO,"archivo.txt"); 
  26.         @registro=<ARCHIVO>; 
  27.         foreach $archivo(@registro) 
  28.         { 
  29.             if ( $archivo =~ /$descripcion/ ) 
  30.             { 
  31.                 print"Sí existe\n"; 
  32.                 print "$archivo\n"; 
  33.                 last;     
  34.             } 
  35.             else 
  36.             { 
  37.                 system("cls"); 
  38.                 print"No existe\n"; 
  39.             } 
  40.         }      
davacro
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-07-04 16:20 @722

Re: Búsqueda en arrays

Notapor explorer » 2011-07-05 13:48 @616

Quizás la variable $registro no se inicializa de forma correcta, si tienes metido ese código dentro de un bucle.

Lo de la bandera se refiere a meter la búsqueda en una variable, y terminar el bucle con el last. Y después del bucle, comprobar si la variable de búsqueda tiene algún valor. Si no lo tiene, no se encontró nada. Si lo tiene, imprimimos esa búsqueda.
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: Búsqueda en arrays

Notapor davacro » 2011-07-06 08:36 @400

¡¡¡Mil gracias!!! Con tus indicaciones y los tutoriales del foro logré hacer lo que quería. Ahora solo tengo que poner la opción de eliminar array y terminé...
davacro
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-07-04 16:20 @722


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron