【问题标题】:catalyst require lib across whole application催化剂需要整个应用程序的 lib
【发布时间】:2013-01-09 02:32:11
【问题描述】:

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

【问题讨论】:

  • 向我们展示您是如何尝试使用它的。加载后,您应该能够从任何地方访问具有完全限定名称的包。

标签: perl file require catalyst


【解决方案1】:
use myapp;

基本上是

BEGIN {
   require myapp;
   import myapp;
}

require myapp; 执行 myapp.pm 如果它还没有被执行。也就是说,无论你在一个进程中执行多少次use myapp;,文件只会被执行(“加载”)一次。

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

你有两个选择。

  1. 调用myapp包中的mysubmyapp::my_sub(...)
  2. 使用use myapp; 在您调用my_sub 的每个包中为my_sub 创建一个本地名称,这样您就可以使用my_sub(...) 来调用它。 (假设myapp 导出my_sub。)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多