Un Array No Inicializado es Vacío

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 TRUE
El 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 FALSE
Tambié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
2011-04-15