En Perl, el arreglo hash asociativo global %ENV contiene las variables de entorno actuales del proceso. Cualquier manipulación de este hash se refleja directamente en el entorno del proceso y, por tanto, en los procesos secundarios generados a través de system, exec, open, etc.
Ejemplo de uso:
print $ENV{"HOME"}; # Obtener la ruta al directorio home del usuario $ENV{"PATH"} = "/usr/bin"; # Sobrescribir la variable PATH
Detalles:
%ENV afecta instantáneamente a todos los futuros comandos de shell ejecutados desde este proceso Perl.undef o eliminar un elemento elimina la variable de entorno correspondiente.%ENV, especialmente en scripts CGI o de sistema.exists $ENV{"VAR"}.¿El operador
$ENV{"MYVAR"} = undefelimina la variable de entorno?
Respuesta: ¡No! Esto solo asigna el valor undef a la variable, pero la clave permanece en el hash. Para eliminar la variable de entorno, use delete $ENV{"MYVAR"}.
# NO elimina la variable del entorno $ENV{"FOO"} = undef; # Correcto — elimina delete $ENV{"FOO"};
Historia
En un servidor web, al limpiar el entorno por razones de seguridad, un programador asignó undef en lugar de eliminar las variables. Las variables no desaparecieron y podían ser utilizadas por atacantes, lo que provocó una vulnerabilidad de ejecución de comandos con rutas peligrosas en PATH.
Historia
Al pasar variables de entorno a subprocessos, olvidaron eliminar las viejas variables, lo que provocó fallos inesperados en utilidades de terceros ejecutables y un comportamiento incorrecto del programa.
Historia
Al intentar limpiar todo el entorno para un proceso secundario, el script simplemente hacía %ENV = ();, pero sin comprobar previamente las variables necesarias. Esto causó caídas, ya que varios servicios requieren claves ambientales obligatorias (por ejemplo, USER o variables de localización).