The %ENV associated array contains the environment as it was passed to the current process. It is not returned when the process ends, so it does not effect other processes. When you fork a process from your Perl script it passes the %ENV hash to the new process. So, for example, if you invent an environment variable and add it to %ENV and then do a backtick shell command, that command will see your variable in the environment, whereas if you launch a separate shell outside of all this, you won't.