催化剂需要整个应用程序的lib

时间:2013-01-25 06:29:44

标签: perl file require catalyst

所以我有一个.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)。我想使整个应用程序和任何请求一次加载文件的效率高,但只是为了清洁代码而加载到一个地方。谢谢!

2 个答案:

答案 0 :(得分:2)

use myapp;

基本上是

BEGIN {
   require myapp;
   import myapp;
}

require myapp;执行myapp.pm(如果尚未执行)。换句话说,无论您在进程中执行use myapp;多少次,该文件都只会被执行(“加载”)一次。

import myapp;调用myapp::import()如果它存在以便导出内容。假设myapp导出my_sub,这就是您的代码无效的原因。

您有两种选择。

  1. 致电mysub包中的myappmyapp::my_sub(...)
  2. 使用use myapp;在您致电my_sub的每个套餐中为my_sub创建一个本地名称,这样您就可以使用my_sub(...)来调用它。 (此assusmes myapp导出my_sub。)

答案 1 :(得分:-1)

命令use myapp;只会加载myapp.pm文件一次,即使多次调用也是如此。但每次调用导入例程都会使my_sub()可用(假设你使用Exporter或其他东西导出它)而不必编写myapp :: my_sub()。