所以我有一个.lib文件,里面有我自己的一些子程序,我希望它可以提供给整个Catalyst应用程序。现在我需要lib / myapp.pm中的文件,我没有问题。但是,每当我尝试在控制器中调用该子例程时,我都会收到此错误:
"Undefined subroutine &myapp::Controller::Root::my_sub called at
/home/user/myapp/lib/myapp/Controller/Root.pm line 35, <DATA> line 1003."
如果我需要控制器中要求的文件,那就不会给我带来任何问题。但是,如果可能的话,我宁愿只在一个地方为整个应用程序加载它。此外,如果我需要控制器中的文件,这是否意味着每次发出请求时都会加载此文件? (如果有任何不同,我正在使用mod_perl)。我想使整个应用程序和任何请求一次加载文件的效率高,但只是为了清洁代码而加载到一个地方。谢谢!
答案 0 :(得分:2)
use myapp;
基本上是
BEGIN {
require myapp;
import myapp;
}
require myapp;
执行myapp.pm
(如果尚未执行)。换句话说,无论您在进程中执行use myapp;
多少次,该文件都只会被执行(“加载”)一次。
import myapp;
调用myapp::import()
如果它存在以便导出内容。假设myapp
导出my_sub
,这就是您的代码无效的原因。
您有两种选择。
mysub
包中的myapp
:myapp::my_sub(...)
。use myapp;
在您致电my_sub
的每个套餐中为my_sub
创建一个本地名称,这样您就可以使用my_sub(...)
来调用它。 (此assusmes myapp
导出my_sub
。)答案 1 :(得分:-1)
命令use myapp;
只会加载myapp.pm文件一次,即使多次调用也是如此。但每次调用导入例程都会使my_sub()可用(假设你使用Exporter或其他东西导出它)而不必编写myapp :: my_sub()。