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