• Publicidad

Qué hay de mal en este script

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

Qué hay de mal en este script

Notapor Sombrerero_Loco » 2008-11-11 11:26 @518

¡¡Hola!!

Bueno, soy nuevo en este foro, pero debido a que estoy empezando a administrar sistemas UNIX me da a mi que voy a empezar a dar vueltas por aquí :)

Bueno, debido a esto, estoy empezando a programar en Perl y la verdad que me siento un poco zote, así que voy paso a paso.

El motivo por el que pongo este post es porque llevo horas pegándome con este Hash y no sé por qué al ejecutarlo me devuelve 3 veces el valor.

Sé que hay maneras más fáciles declarando los valores del hash en la forma $hash{$valor} pero quiero hacerlo con búsquedas dentro del hash.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

my %nombresde = qw {
   nico perez
   gonzalo garcia
   luisin garcia
   };

chomp (my $busca = <STDIN>);
foreach $encontradokey (sort keys %nombresde)
        {
                if ($encontradokey eq $busca)
                        {
                        print "lo he encontrado, su apellido es $encontradokey";
                        }
                else
                        {
                        print "tu nombre $busca no lo tengo dado de alta, sorry";
                        }
        }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Este es el código, también he probado en vez del foreach con each() para que me retorne los dos valores de clave y valor, pero ahí sí me funciona mejor aunque al hacerte tres iteraciones me devuelve 3 veces el texto del else (no del if)

No sé, acepto cualquier tipo de sugerencia, recomendación, etc. etc...

¡Gracias!
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Publicidad

Notapor explorer » 2008-11-11 12:52 @578

Bienvenido a los foros de Perl en Español, Sombrerero_Loco.

El mensaje te puede salir 3 veces... o una vez por cada clave, porque la comprobación no termina el bucle.

Podrías usar un comando last para terminarlo, una vez que encuentres a la persona.

Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#use strict;
use warnings;
use diagnostics;

my %nombresde = (
        nico    => 'perez',
        gonzalo => 'garcia',
        luisin  => 'garcia',
);

print 'Introduce un nombre: ';
chomp (my $busca = <STDIN>);

my $lo_he_encontrado = '';

foreach $encontradokey (sort keys %nombresde) {
    if ($encontradokey eq $busca) {
        $lo_he_encontrado = $nombresde{$encontradokey};
        last;
    }
}

if ($lo_he_encontrado) {
    print "Lo he encontrado, su apellido es $lo_he_encontrado\n";
}
else {
    print "Tu nombre $busca no lo tengo dado de alta, sorry\n";
}

__END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Observa que hemos usado una variable, la $lo_he_encontrado para guardar el apellido encontrado dentro del bucle. El bucle termina con el comando last, si lo hemos encontrado. Y después del bucle, informamos al usuario.

Otra opción que puedes investigar es usar el comando grep().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

¡Gracias!

Notapor Sombrerero_Loco » 2008-11-12 03:36 @191

Lo único que no me queda claro (y entiendo que será porque como estoy empezando no sé cómo van bien las estructuras de Perl) es por qué después del last abrimos un if.
¿Esto quiere decir que si lo encuentra, ejecuta last y salta al if, y que este if comprueba si la variable está llena y si lo esta lo pinta, y sino sale al else?

¡Gracias!
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Notapor explorer » 2008-11-12 07:47 @366

Sí, eso es. Te ha faltado decir que si lo encuentra, rellena la variable con lo encontrado.

Lo que ocurre es que estamos usando la misma variable para indicar que ha encontrado algo y además, guardar ese algo.

Quizás, si damos un nombre correcto a las variables, quede algo más claro:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#use strict;
use warnings;
use diagnostics;

%apellido_de = qw(
        nico    perez
        gonzalo garcia
        luisin  garcia
);

print 'Introduce un nombre: ';
chomp ($nombre_a_buscar = <STDIN>);

my $apellido_encontrado = '';

foreach $nombre_cliente (sort keys %apellido_de) {
    if ($nombre_cliente eq $nombre_a_buscar) {
        $apellido_encontrado = $apellido_de{$nombre_cliente};
        last;
    }
}

print $apellido_encontrado
    ? "Lo he encontrado, su apellido es $apellido_encontrado"
    : "Tu nombre $nombre_a_buscar no lo tengo dado de alta, sorry"
    , "\n"
    ;

__END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

(El último print es una licencia grafico-artística. No usar en entornos de desarrollo)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

¡Clarificado!

Notapor Sombrerero_Loco » 2008-11-12 08:22 @390

Muchas gracias, ¡tutto clarissimo!

¡Un saludo!
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Notapor DAM » 2008-11-25 03:43 @196

Si he entendido bien lo que quieres es buscar una clave dentro de una tabla, pues para ello hay una función muy útil que es defined() para comprobar que existe ese valor:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#use strict;
use warnings;
use diagnostics;

my %apellido_de = qw(
        nico    perez
        gonzalo garcia
        luisin  garcia
);

print 'Introduce un nombre: ';
chomp (my $nombre= <STDIN>);
if (defined ($apellido_de{$nombre})) {
        print  "\nEl apellido de $nombre es : $apellido_de{$nombre};
}
else {
       print "
\nNo existe nombre de usuario $nombre";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
DAM
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-06-18 06:52 @328

Notapor Sombrerero_Loco » 2008-11-25 07:24 @350

¡Gracias!, mira, esa función no la sabía, bueno, intuía cómo funcionaba, pero no cómo ponerlo en la práctica (voy pasito a pasito en mi aprendizaje y si no me equivoco eso está en capítulos más adelante.)

¡Muchas gracias por la info!
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514


Volver a Básico

¿Quién está conectado?

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

cron