por 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