• Publicidad

Problemas con vector y error

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

Problemas con vector y error

Notapor thedj » 2009-05-09 08:37 @401

Muy buenas tardes, tengo un problema con un vector, que me da un cierto error, que no consigo resolver. Resulta que en la siguiente función:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub gid_primario
{
    my $usuario=$_[0];
    open(LINEAS,$FICH_USU) or die "No se pudo abrir el fichero";
    while($filas=<LINEAS>)
    {
        @filas = split (/:/,$filas);
        if(defined($filas[0]) && $filas[0] eq $$usuario)#Linea del error
        {
            close(LINEAS);
            return $filas[3];
        }
    }
    close(LINEAS);
    return 0;
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Me devuelve 1 error (Repetido en cada iteración del bucle), que me indica lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 1.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 2.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 3.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 4.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 5.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 6.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 7.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 8.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 9.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 10.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 11.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 12.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 13.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 14.
Use of uninitialized value in string eq at usugrupo.pl line 817, <LINEAS> line 15.
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


He probado infinidad de cosas, y no se que le pasa, ya que el elemento $filas[0] y $$usuarios no están vacios porque ya los he metido en un print. He comprobado $filas[0] and $filas[0] también y nada. Anoche me lleve 2h intentando resolverlo y no habia forma. A ver si me podéis ayudar.

Un cordial saludo.

PD: También he probado a meter en la línea que devuelve $filas[3]:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if(defined($filas[3])){ return $filas[3];}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
thedj
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2009-05-03 17:15 @760

Publicidad

Notapor explorer » 2009-05-09 08:47 @407

No es un error, es un aviso.

El problema es haber usado '&&' en lugar de 'and'.

Cambia
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if(defined($filas[0]) && $filas[0] eq $$usuario)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if($filas[0] and $filas[0] eq $$usuario)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ocurre que '&&' tiene una prioridad más alta que 'and', por lo que en realidad estabas escribiendo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if( ( defined($filas[0]) && $filas[0] ) eq $$usuario)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y claro, ahí sí que estás evaluando $filas[0] y si está indefinido, salta el aviso.
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

Notapor thedj » 2009-05-09 08:51 @410

Muy buenas tardes explorer, ante todo muchas gracias por su atención.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if($filas[0] and $filas[0] eq $$usuario)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
#Origina el mismo aviso

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if( ( defined($filas[0]) && $filas[0] ) eq $$usuario)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
#Origina el aviso

Un saludo
thedj
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2009-05-03 17:15 @760

Notapor explorer » 2009-05-09 08:59 @416

La segunda línea te la puse para que vieras el error, no para que la probaras... ya sabemos que está mal.

Si sigue saliendo el mismo error con la primera línea, es quizás que $$usuario contiene un valor no inicializado. ¿Has comprobado lo que contiene?
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

Notapor thedj » 2009-05-09 09:01 @417

Acabo de resolver el problema, explorer, resulta que llamaba a la función de la siguiente manera: (\$$usuario), tal y como me comentaron y resulta que como funciona es con (\$usuario).

Un saludo y muchas gracias por su atención.
thedj
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2009-05-03 17:15 @760

Notapor explorer » 2009-05-09 09:19 @430

Pues si llamas a una función como te dicen otros, y se equivocan, pues entonces harías mejor en aprender tu mismo cómo se ha de llamar a la función, para no depender de ellos...

Una pregunta... ¿sabes qué significa pasar como argumentos de una función \$usuario?

Si no lo sabes, es que quizás estás usando características de Perl que sobrepasan tus conocimientos, con el consiguiente peligro de que algo no funcione como tu quieras... o que el profesor -que está leyendo esto- te lo pregunte.

Programar con el método prueba-error llega a ser muy aburrido y muchos estudiantes acaban odiando programar.

Perl no es tan aburrido porque su sintaxis es muy amplia y permite hacer cosas divertidas y creativas.

Pero solo si las conoces.

Por ejemplo, tu función se puede escribir así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub gid_primario {
    my $usuario_a_buscar = shift;

    open USUARIOS, $FICH_USU or die "ERROR: No se pudo abrir el fichero: $!\n";

    while (my $linea_usuario = <USUARIOS>) {
        my @usuario = split /:/, $linea_usuario;

        if (     $usuario[0]
             and $usuario[0] eq $usuario_a_buscar) {
            return $usuario[3];
        }
    }
    return 0;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y ahora ya si que puedes hacer la llamada sin '\':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $usuario = 'thedj';
gid_primario($usuario);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados

cron