perl“do”作品“require”不:未定义的子程序

时间:2014-09-11 23:01:11

标签: perl

由于我一直在使用{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?如果没有,那我在这里错过了什么?

1 个答案:

答案 0 :(得分:4)

是的,我认为您的诊断是正确的。由于A.pm缺少package语句,因此在评估文件时,将在活动的任何包下定义其中的subs。由于do无法防止双重评估,因此A在两个不同的包中加入。从require开始,它们最终出现在一个包中,哪个包取决于谁先加载A。

解决方案:在没有require语句的文件中不要使用use(当然不是package):)