我对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或类似的程序来“创建”模块(告诉你,完全是新手......)?
提前致谢!
答案 0 :(得分:3)
我通常会创建自己的模块前缀 - 以项目或我工作的地点命名。例如,您可以使用名为Mu::Foo
和Mu::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,它可能会给你一个很好的解决方案!