ProgramaciónDesarrollador Backend Perl, Ingeniero de Datos (Perl), Fullstack Perl

¿Cuáles son las trampas al trabajar con el operador defined y cómo verificar correctamente la existencia y la no vacuidad de los valores en diferentes tipos de variables en Perl?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

El operador defined en Perl verifica si un valor está definido (si no es undef). Es importante distinguir:

  • Para escalares: defined($x) devolverá true si $x no es igual a undef (sin importar el valor, incluso si es una cadena vacía o 0).
  • Para hashes: defined($hash{$key}) verifica si el valor del elemento está definido, pero no garantiza que la clave misma exista.
  • Para arrays: defined($array[$i]) — de manera similar, el elemento puede estar definido, pero el array puede ser más largo o más corto.
  • Para verificar la existencia de una clave en un hash se utiliza 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

Pregunta trampa.

¿Cuál es la diferencia entre exists $hash{$key} y defined $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

Ejemplos de errores reales debido al desconocimiento de las sutilezas del tema.


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.