0

所以我有一个 .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)。我想让它在为整个应用程序和任何请求加载一次的文件方面变得高效,但为了干净的代码也只在一个地方加载。谢谢!

4

2 回答 2

2
use myapp;

基本上是

BEGIN {
   require myapp;
   import myapp;
}

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

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

你有两个选择。

  1. 调用包mysub中的myappmyapp::my_sub(...)
  2. 用于为您调用的每个包use myapp;创建一个本地名称,以便您可以仅使用. (这假设出口。)my_submy_submy_sub(...)myappmy_sub
于 2013-01-25T08:18:32.997 回答
-1

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

于 2013-01-25T07:59:05.720 回答