Los escalares no inicializados tienen el valor undef. Sin embargo, las variables array no inicializadas tienen como valor la lista vacía (). Si se asigna undef a una variable de tipo array lo que se obtiene es una lista cuyo único elemento es undef:
@a = undef; # Equivalente a @a = ( undef ); if (@a) { ... } # Por tanto TRUEEl modo mas simple de evitar este tipo de problemas cuando se quiere limpiar una variable de tipo array es asignar explícitamente la lista vacía ():
@a = (); if (@a) { ...}; # scalar(@a) == 0 es FALSETambién se puede usar el operador undef:
undef @a; if (defined(@a)) { ... }; # FALSE
Es posible asignar undef a los elementos de un array:
$a[3] = undef;O bien usando la lista vacía, como se hace en la siguiente sesión con el depurador:
DB<1> @a = 0..9 DB<2> @a[1,5,7] = () DB<3> p "@a" 0 2 3 4 6 8 9 DB<4> p $#a 9 DB<5> p scalar(@a) 10 DB<6> $" = "," # separador de output de arrays DB<7> p "@a" 0,,2,3,4,,6,,8,9 DB<8> @a[1..7] = () DB<9> p "@a" 0,,,,,,,,8,9
Casiano Rodríguez León