所以我有一个 .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)。我想使整个应用程序和任何请求的文件加载一次,但为了干净的代码,也只在一个地方加载。谢谢!
use myapp;
基本上是
BEGIN {
require myapp;
import myapp;
}
require myapp;
执行myapp.pm
(如果尚未执行)。换句话说,无论您在一个进程中执行多少次use myapp;
,该文件都只会执行("加载")一次。
import myapp;
调用myapp::import()
如果它存在,以便导出内容。假设myapp
导出my_sub
,这就是您的代码不起作用的原因。
您有两种选择。
- 调用
myapp
包中的mysub
:myapp::my_sub(...)
。
使用 use myapp;
为调用的每个包中的my_sub
创建本地名称my_sub
以便只需使用my_sub(...)
即可调用它。(这myapp
出口my_sub
。
命令 use myapp;
只会加载一次 myapp.pm 文件,即使多次调用也是如此。但是每次它调用导入例程都会使my_sub()可用(假设您使用导出器或其他东西导出它),而无需编写myapp::my_sub()。