Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl“do”工作“require”不工作:未定义的子例程_Perl - Fatal编程技术网

perl“do”工作“require”不工作:未定义的子例程

perl“do”工作“require”不工作:未定义的子例程,perl,Perl,由于我一直在从有人称之为perl 4的编码风格重构我的一些代码以使用包,我有一个问题,我仍然没有完全理解。我知道use在编译时包含一个文件,在运行时还需要其他区别,两者都像在BEGIN部分一样运行。我知道do有点像eval,但有些不同 我有一个可以自己运行的脚本B,我根据需要从另一个脚本C调用它。脚本B在一个.pm文件a上调用require,该文件只有两个子文件,一个子文件用于设置变量,另一个子文件用于返回变量和一个声明为我们的变量,我猜我的在这里也会实现同样的效果。此.pm未封装在包中,因此出

由于我一直在从有人称之为perl 4的编码风格重构我的一些代码以使用包,我有一个问题,我仍然没有完全理解。我知道use在编译时包含一个文件,在运行时还需要其他区别,两者都像在BEGIN部分一样运行。我知道do有点像eval,但有些不同

我有一个可以自己运行的脚本B,我根据需要从另一个脚本C调用它。脚本B在一个.pm文件a上调用require,该文件只有两个子文件,一个子文件用于设置变量,另一个子文件用于返回变量和一个声明为我们的变量,我猜我的在这里也会实现同样的效果。此.pm未封装在包中,因此出现这种情况。如果我运行脚本B,它将顺利运行。如果我需要脚本C中的脚本B,脚本C也需要一个需要a.pm的包d.pm,并使用访问器func,我会得到:

Undefined subroutine &main::func_in_A called at script_B
然而,如果我在脚本中使用A.pm,一切都会按预期工作

当我输入问题时,我想我意识到发生了什么,但还是让我问一下,以确定一下


这是因为require跟踪它加载的文件,而do不跟踪,因此它只加载一次文件,尽管这一次在包的名称空间中,因此在那里执行require时,符号不会被引入MAIN吗?如果没有,那么我在这里错过了什么

是的,我认为你的诊断是正确的。由于A.pm缺少package语句,因此在对文件求值时,将在任何激活的包下定义其中的sub。由于do没有防止双重评估的保护,A的Sub被分为两个不同的包。因为require是这样做的,所以它们最终会在一个包中结束,而哪个包取决于谁先加载一个包


解决方案:不要使用require,当然也不要在没有包语句的文件上使用:

太好了!谢谢你的意见!我将等待,看看是否还有其他人对此有所补充。当我问这个问题时,我似乎从未接受过这个答案。对不起@疯狂哈,一点问题也没有:没有回答你的问题-霍布斯已经回答了-但是你可能对啊感兴趣,很有趣,谢谢你的链接!