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

Perl 特殊变量是否在其他必需模块的函数调用中保持其存在?,perl,require,Perl,Require,我不是perl专家,也不太了解perl的所有范围规则是如何工作的。 我正在设置一个$ENV{'whatever'}环境变量,然后在另一个source.pl文件中调用一个函数并尝试读取该ENV条目,但没有得到任何结果。文档到处都说ENV对当前进程和任何分叉子进程都有效,但是在其他源文件中是否可以访问%ENV变量 源文件是通过“require”命令包含的。这是正确的方法吗,还是在需要源文件时变量如何可用的问题上存在某种静态(首次出现)?%ENV是全局变量,因此可以从加载到进程中的每个源文件的任何位置

我不是perl专家,也不太了解perl的所有范围规则是如何工作的。 我正在设置一个$ENV{'whatever'}环境变量,然后在另一个source.pl文件中调用一个函数并尝试读取该ENV条目,但没有得到任何结果。文档到处都说ENV对当前进程和任何分叉子进程都有效,但是在其他源文件中是否可以访问%ENV变量


源文件是通过“require”命令包含的。这是正确的方法吗,还是在需要源文件时变量如何可用的问题上存在某种静态(首次出现)?

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

当使用
fork
创建新进程时,将继承
%ENV
,但新进程将获得自己的副本,因此在其中一个进程中所做的任何更改在另一个进程中都不可见

如果您正在使用
do
require
use
加载另一个源文件,那么它将被加载到相同的进程中,并且它将看到相同的
%ENV


但是,如果使用
system
exec
加载新脚本,则新脚本将加载到一个新进程中,它将获得自己的
%ENV
%ENV
副本是一个全局脚本,因此可以从加载到进程中的每个源文件的任何位置访问它

当使用
fork
创建新进程时,将继承
%ENV
,但新进程将获得自己的副本,因此在其中一个进程中所做的任何更改在另一个进程中都不可见

如果您正在使用
do
require
use
加载另一个源文件,那么它将被加载到相同的进程中,并且它将看到相同的
%ENV

但是,如果使用
system
exec
加载新脚本,则新脚本将在新进程中加载,它将从以下位置获取自己的
%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  : ""
发件人:

哈希
%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  : ""

请随意将您的小测试程序添加到您的问题中。请随意将您的小测试程序添加到您的问题中。我相信您。它是在我刚刚编写的一个测试程序中实现的,但在我真正的(巨大的遗产)程序中却不起作用。赫伦普。你能想出任何会干扰功能的东西吗?我可以看看是否有什么东西把它吹走了?其他软件包,比如CGI之类的?啊哈,我知道了。在$ENV{'whatever'}中没有关于'whatever'的引号,上帝知道它是如何工作的,但我不是上帝,所以我不知道。谢谢你确认我的理解。@stu,不管你用什么来代替
什么
都是作为Perl表达式执行的。很明显,您有一个标识符,因为
$ENV{ident}
$ENV{'ident}
完全可以接受的替代品。我相信您。它是在我刚刚编写的一个测试程序中实现的,但在我真正的(巨大的遗产)程序中却不起作用。赫伦普。你能想出任何会干扰功能的东西吗?我可以看看是否有什么东西把它吹走了?其他软件包,比如CGI之类的?啊哈,我知道了。在$ENV{'whatever'}中没有关于'whatever'的引号,上帝知道它是如何工作的,但我不是上帝,所以我不知道。谢谢你确认我的理解。@stu,不管你用什么来代替
什么
都是作为Perl表达式执行的。显然,您有一个标识符,因为
$ENV{ident}
$ENV{'ident}
完全可以接受的替代方案。