El operador defined en Perl verifica si un valor está definido (si no es undef). Es importante distinguir:
defined($x) devolverá true si $x no es igual a undef (sin importar el valor, incluso si es una cadena vacía o 0).defined($hash{$key}) verifica si el valor del elemento está definido, pero no garantiza que la clave misma exista.defined($array[$i]) — de manera similar, el elemento puede estar definido, pero el array puede ser más largo o más corto.exists.Ejemplo:
my %h = (a => undef); if (exists $h{a}) { print "La clave 'a' existe "; } if (defined $h{a}) { print "La clave 'a' está definida "; } else { print "La clave 'a' no está definida "; }
Resultado:
La clave 'a' existe
La clave 'a' no está definida
¿Cuál es la diferencia entre
exists $hash{$key}ydefined $hash{$key}y cuándo la verificación de defined para un hash dará un resultado inesperado?
Respuesta: defined $hash{$key} verifica el valor, pero si la clave no existe, devolverá un valor indefinido. Si la clave existe, pero su valor es undef, defined devolverá false. Pero si la clave no existe, también será false. Por lo tanto, para verificar la existencia de una clave, siempre usa exists.
Ejemplo:
my %h = (foo => undef); if (defined $h{foo}) { ... } # false if (exists $h{foo}) { ... } # true
Historia
En un proyecto, se verificaba el flag de "disponibilidad" como
defined($status{$id}), y si el valor era undef, se consideraba que la tarea no había sido procesada. Sin embargo, las claves con undef eran válidas y no había una verificación de exists; como resultado, parte de los datos procesados se ejecutaban nuevamente.
Historia
Un programador, al importar datos de un archivo, comparaba cadenas así:
if (defined $line && $line ne ''). El problema: a veces $line podía ser una cadena nula '0'. Dicha cadena no está vacía, pero la comparación con defined (en lugar de verificar ne '') resultaba en la pérdida de esas cadenas.
Historia
En un gran script de Perl, que trabajaba con hashes, la única verificación de existencia de un elemento era defined; como resultado, para las claves con valor undef se producían errores y datos perdidos en los informes.