在pm模块中包含文件

时间:2011-06-24 19:54:26

标签: perl include cgi fastcgi perl-module

我对Perl / Fastcgi完全不熟悉。

我有一些pm-modules,必须添加很多脚本,随着时间的推移它会增长和增长。因此,我需要一个使管理员更容易的结构。

所以,我想在某种目录结构中创建文件,我可以包含它。我希望我包含的文件非常简单,就像文本写在我所做的文件中一样。

我尝试过“做”,“使用”和“要求”。我想要包含的实际文件位于Perl正在查看的目录之一。(使用perl -V验证)

我在BEGIN {}内外尝试过。

我该怎么做?是否有可能包括pm文件中的pm文件?它必须是我包含的pm文件还是可以是任何扩展名?

我尝试了几种方法,下面包含的是我的最后一次尝试。

Config.pm

package Kernel::Config;

sub Load {

#other activities

require 'severalnines.pm';

#other activities

}
1;

severalnines.pm

# Filter Queues

$Self->{TicketAcl}->{'ACL-hide-queues'} = {
                Properties => {
},
                PossibleNot => {Ticket => { Queue =>
                    ['[RegExp]^*'] },

  },
};
1;

我没有在与此相关的Apache的error_log中收到任何错误。尽管如此,如果我把它放在Config.pm文件中,代码就不会被识别出来。

我不打算开始编程很多,只是在第三方应用程序中做一些管理员。尽管如此,我还是试图了解如何使用包含文件。是否somenines.pm被认为是一个perl模块,我是否需要使用像h2xs或类似的程序来“创建”模块(告诉你,完全是新手......)?

提前致谢!

2 个答案:

答案 0 :(得分:3)

我通常会创建自己的模块前缀 - 以项目或我工作的地点命名。例如,您可以使用名为Mu::FooMu::Bar的模块将Mu下的所有内容放在Mu下。使用多个模块(不要试图将所有内容保存在一个文件中)并使用*.pm后缀命名模块。

然后,如果Mu目录与您的程序位于同一目录中,则只需执行此操作:

use Mu::Foo;
use Mu::Bar;

如果他们在另一个目录中,您可以这样做:

use lib qw(/path/to/other/directory);
use Mu::Foo;
use Mu::Bar;
  

是否可以在pm文件中包含pm文件?

为什么肯定是的。

  

所以,我想在某种目录结构中创建文件,我可以包含它。我希望我包含的文件 exaclty,就好像文本写在我做include的文件中一样。

这是一个糟糕的坏主意。你最好使用包机制。也就是说,将每个模块声明为单独的包名。否则,你的模块将有一个变量或函数,你的脚本将覆盖它,你永远不会知道它。

在Perl中,您可以通过在模块前添加模块名称来引用模块中的变量。 (例如File::Find确实如此。例如$File::Find::Name是找到的文件名。这不会污染您的命名空间。

如果您真的想在命名空间中使用模块的函数和变量,请查看@EXPORT_OK中的Exporter列表变量。这是您要导入模块命名空间的所有变量和函数的列表。但是,它不是自动的,您必须在use语句旁边列出它们。这样,你就更有可能了解它们。使用Exporter并不太难。在你的模块中,你要把:

package Mu::Foo;
use Exporter qw(import);
our EXPORT_OK = qw(convert $fundge @ribitz);

然后,在你的程序中,你会把:

use Mu::Foo qw(convert $fundge @ribitz);

现在,您可以访问convert$fundge@ribitz,就好像它们是您主程序的一部分一样。但是,您现在已经记录了您正在从Mu::Foo中提取这些子例程和变量。

(如果您认为这很复杂,请高兴我没有告诉您,您真的应该在模块中使用面向对象的方法。这真的是最好的方法。)

答案 1 :(得分:0)

if (    'I want the files that I include will be exactly like if the text were written in the file where I do the include.' 
     && 'have to add a lot of scripts and over time it will grow and grow') {
    warn 'This is probably a bad idea because you are not creating any kind of abstraction!';
}

看看Exporter,它可能会给你一个很好的解决方案!