[Programación] Re: [Programación] Perl... me j ode una cadena vacia...

Nicolás Aimetti programacion@lugro.org.ar
Fri, 09 Dec 2005 21:22:03 -0300


>Holas como puedo hacer que una cadena vacia en uno de los campos... de
>A...
>como se ve aca....
>G R 	6
>J L D 	6
> 	6 <-------- pica....
>M C	5
>A A	5
>
>No me cause este error 
>======================================
>Use of uninitialized value in string ne at filtro.pl line 103, <> line
>637.
>Use of uninitialized value in string ne at filtro.pl line 107, <> line
>637.
>Use of uninitialized value in string ne at filtro.pl line 103, <> line
>637.
>Use of uninitialized value in string ne at filtro.pl line 107, <> line
>637.
>Use of uninitialized value in string ne at filtro.pl line 103, <> line
>637.
>=======================================
>En esta comparación....
>while(($j<$cont2)&&($C[$i+1]->[0] ne $A[$j]->[0])){ $j++;}
>Saludos Horacio...
>
>  
>
En principio ese error no es tan malo porque es solo un warning...
Por tanto la forma más sencilla de sacarlo sería eliminar el -w cuando 
se invoca al perl.
Claro que eso sería exponerse a los severos castigos de la inquisición: 
http://www.cafepress.com/cp/moredetails.aspx?productNo=4100611&pr=B&showbleed=false&tab=1&Zoom=2

El Warning ese aparece porque uno le pasa como parámetro al operador 
'ne' una variable que no ha sido definida, o sea, ni siquiera es el 
string vacío "", sería como un NULL en C. Por tanto la forma de eliminar 
el warning es o bien seteado esa variable con algo (cero, el string 
nulo, lo que sea que venga bien al caso),  o sino antes de hacer el 
chequeo comprobar que ambas variables están definidas (casi nunca es la 
mejor opción, a veces sí): esto podría hacerse así:

while(   ( $j < $cont2 ) &&  (defined $C[$i+1]->[0] &&  defined  
$A[$j]->[0] &&  $C[$i+1]->[0] ne $A[$j]->[0] ) ) { $j++;  }

De todas formas yo en este caso lo primero que haría sería ver por que 
hay un valor que no está definido.

------------------
El tema de definido, no definido en perl es más o menos así. Las 
variables tiene dos estados: definida, o no definida. No estar definida 
sería como tener un puntero apuntado a NULL en C. 
ejemplos...

my $a;
defined $a ;   #da false
# $a no esta definida, solo est'a declarada

$a = 0;
defined $a;    #da true.
#a esta definida.

undef $a; #
defined $a ;   #da false

Las dos funciones que entran en juego ac'a son undef y defined.

defined te dice si una varible esta definida, es un predicado.

undef (la función) pone en estado undef todas las variables que se le 
pasen por parámetros y a la vez devuelve el valor undef.
O sea que..
my $a = undef;
Tambíen es un método valido para por en estadono definido una variable.

Otra función de esta camada que también es interesante es 'exists': te 
dice si cierta clave en un hash a sido definida.

Ejemplo:

my %h = (hola => 'mundo' , chau => undef );

exists $h{'hola'}; #da True
exists $h{'chau'}; #da True
exists $h{'otra cosa'}; #da False
defined $h{'hola'}; #da True
defined $h{'chau'}; #da False

----------------------

Recién llegue a mi casa, bajé los mails desde mi maquina (antes estaba 
en el trabajo) y vi que había doce mails en la
lista de programación del lugro, no había caído en la cuenta, pero creo 
que hace bastante que no se movía tanto programación. Esperemos que más 
gente se enganche también a postear en  está lista que por lo general 
queda bastante recluida en comparación a las otras dos (lugro y 
lugro-mix) y programar es un bello arte.

Saludos,
             Nicolás.