由于我一直在使用{perl 4编码风格'重构我的一些代码来使用package
,我对一些我仍然不太了解的问题提出了疑问。我知道use
在编译时包含一个文件,在运行时包含require
(以及其他差异),两者都在BEGIN
部分中运行。我知道do
有点像eval
(有一些差异)。
我有一个可以单独运行的脚本(B),我从另一个脚本(C)调用它作为require
。 脚本B 在.pm文件(A)上调用require
,该文件只有两个子(一个用于设置变量,另一个用于返回它)和一个声明为{{1的变量(我猜这里our
会达到同样的效果)。这个.pm是 not 封装了my
(因此情况)。如果我运行脚本B ,它可以正常运行。如果我来自脚本C 的package
脚本B (require
'还有require
,那么{。{ 1}} s A.pm,并使用accessor func),我得到:
package
但是,如果 script_B 中的require
A.pm ,一切都按预期工作。
当我在输入问题时,我想我已经意识到发生了什么,但我还是要问一下,确保这一点。
这是因为Undefined subroutine &main::func_in_A called at script_B
跟踪已加载的文件(而do
没有加载)这样的事实,因此它只加载文件一次,尽管事实是曾经在包的命名空间中,因此在require
执行时,符号不会被带入MAIN?如果没有,那我在这里错过了什么?
答案 0 :(得分:4)
是的,我认为您的诊断是正确的。由于A.pm缺少package
语句,因此在评估文件时,将在活动的任何包下定义其中的subs。由于do
无法防止双重评估,因此A在两个不同的包中加入。从require
开始,它们最终出现在一个包中,哪个包取决于谁先加载A。
解决方案:在没有require
语句的文件中不要使用use
(当然不是package
):)