В Perl глобальный ассоциативный массив %ENV содержит текущие переменные окружения процесса. Любая манипуляция этим хэшем напрямую отражается на среде процесса и, соответственно, дочерних процессов, порождаемых через system, exec, open и т. д.
Пример использования:
print $ENV{"HOME"}; # Получить путь к домашней директории пользователя $ENV{"PATH"} = "/usr/bin"; # Перезаписать переменную PATH
Тонкости:
%ENV мгновенно влияют на все будущие команды оболочки, запущенные из этого Perl-процесса.undef или удаление элемента удаляет соответствующую переменную окружения.%ENV, особенно в CGI- или системных скриптах.exists $ENV{"VAR"}.Удаляет ли операция
$ENV{"MYVAR"} = undefпеременную окружения?
Ответ: Нет! Это просто присваивает переменной значение undef, но ключ остаётся в хэше! Чтобы удалить переменную окружения, используйте delete $ENV{"MYVAR"}.
# НЕ удаляет переменную из среды $ENV{"FOO"} = undef; # Правильно — удаляет delete $ENV{"FOO"};
История
На веб-сервере, при очистке окружения для безопасности, программист присваивал undef вместо удаления переменных. Переменные не исчезли и могли использоваться злоумышленниками, вызвав уязвимость исполнения команд с опасными путями в PATH.
История
При передаче переменных среды в подпроцессы забыли удалить старые переменные, что вызвало неожиданные сбои в исполняемых сторонних утилитах и некорректное поведение программы.
История
Пытаясь очистить всё окружение для дочернего процесса, скрипт просто делал %ENV = ();, но без предварительной проверки нужных переменных. Это вызвало падения, так как ряд сервисов требует обязательных ключей среды (например, USER или переменные локализации).