特殊变量是否在其他所需模块的函数调用中保持存在?

时间:2012-05-08 19:53:33

标签: perl require

我不是perl专家,我不太了解perl的所有范围规则是如何运作的。 我正在设置一个$ ENV {'whatever'}环境变量,然后我在另一个源.pl文件中调用一个函数并尝试读取该ENV条目,我什么都没收到。 Docs说ENV在当前进程和任何分叉的子进程中持续存在,但是可以访问其他源文件中可用的%ENV变量吗?

源文件是通过'require'命令包含的。这是正确的方法,还是在需要源文件时有关变量如何可用的静态(第一次)?

2 个答案:

答案 0 :(得分:4)

%ENV是全局的,因此可以从加载到流程中的每个源文件中的任何位置访问它。

当使用%ENV创建新进程时,

fork 继承,但新进程会获得自己的副本,因此在其中进行的任何更改都不会在其他

如果您使用dorequireuse加载其他源文件,则会将其加载到同一进程中,并且会看到相同的%ENV

但是,如果您使用systemexec加载新脚本,则新脚本将加载到新进程中,并且会获得自己的%ENV副本。

答案 1 :(得分:1)

来自perldoc perlvar

%ENV
     

哈希%ENV包含您当前的环境。设置值   ENV会改变您随后的任何子进程的环境   fork()关闭。


require - .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  : ""