我不是 perl 专家,我不太了解 perl 的所有作用域规则是如何工作的。我正在设置一个 $ENV{'whatever'} 环境变量,然后我在另一个源 .pl 文件中调用一个函数并尝试读取该 ENV 条目,但我什么也没得到。文档到处都说 ENV 对于当前进程和任何分叉的子进程都存在,但是在其他源文件中是否可以访问 %ENV 变量?
源文件是通过“require”命令包含的。这是正确的方法,还是在需要源文件时如何使变量可用的静态(第一次)?
%ENV
是一个全局的,因此它可以从加载到进程中的每个源文件的任何地方访问。
%ENV
当使用 a 创建新进程时会继承fork
它,但新进程会获得自己的副本,因此在一个进程中所做的任何更改都不会在另一个进程中可见。
如果您使用do
or加载另一个源文件require
,use
那么它将被加载到同一个进程中,它会看到相同的%ENV
.
但是,如果您使用system
或加载新脚本,exec
然后新脚本正在新进程中加载,它将获得自己的%ENV
.
%ENV
哈希
%ENV
包含您当前的环境。fork()
在 ENV 中设置一个值会更改您随后关闭的任何子进程的环境 。
require
-ing .pl 文件与分叉命令不同。
通过 Bash 包装器设置必要的环境变量会更简单:
$ cat wrapper.sh
#!/bin/bash
export whatever="/usr/bin/some_dir/"; # Set to env
perl script.pl; # Invoke the script
$ cat script.pl
#!/usr/bin/perl
print $ENV{whatever}; # wrapper.sh : "/usr/bin/some_dir/"
# script.pl : ""