【问题标题】:Including files in pm modul在 pm 模块中包含文件
【发布时间】:2011-06-24 19:54:25
【问题描述】:

我对 Perl/Fastcgi 完全陌生。

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

所以,我想在某种可以包含的目录结构中创建文件。我希望我包含的文件与文本写在我执行包含的文件中一样。

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

我在 BEGIN {} 内外都试过了。

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

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

配置.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 文件中,代码仍然无法识别。

我不打算开始大量编程,只是在 3rd 方应用程序中做一些管理。尽管如此,我还是四处寻找,试图了解它如何与包含文件一起工作。被认为是 perl 模块,我需要使用像 h2xs 或类似的程序来“创建”模块(告诉你,完全是新手......)吗?

提前致谢!

【问题讨论】:

  • 你试过require '/full/path/to/file.foo'吗?您是否确保所有这些脚本都返回一个真值(通常通过在文件底部放置一个1; 来完成)。此外,它是 Perl,而不是 Pearl。您是否尝试过检查 apache 错误日志?失败的require 将使向 stderr 发出错误的进程崩溃。
  • 谢谢!我确实添加了 1;因为我没有那个。可以找到该文件,但我认为未使用该代码。请查看我更新后的代码。
  • 如果我做了您的任何建议,我仍然需要进行编码才能使用我包含的任何内容。我的观点是不需要在 Config.pm 文件中做任何其他事情,而不仅仅是某种包含。我是否必须查看服务器端包含的内容?

标签: perl include cgi fastcgi perl-module


【解决方案1】:

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

那么,如果Mu目录和你的程序在同一个目录下,你只需要这样做:

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

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

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

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

为什么肯定是的。

所以,我想在某种可以包含的目录结构中创建文件。我希望我包含的文件就像文本是写在我执行包含的文件中一样。

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

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

如果您确实希望您的命名空间中包含模块的函数和变量,请查看Exporter 中的@EXPORT_OK 列表变量。这是您要导入模块命名空间的所有变量和函数的列表。但是,这不是自动的,您必须在 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 中提取这些子例程和变量。

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

【讨论】:

  • 你可以通过定义一个指向一个目录的PERL5LIB环境变量来简化这个过程,这将被添加到你的@INC。现在把你所有的自定义.pm文件放在这个目录下,你就可以像安装它们一样使用它们了。
  • 感谢您的回答。我用我的代码在我的帖子中做了一些更新。可以找到文件,但代码没有被应用。
【解决方案2】:
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,它可能会给你一个很好的解决方案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2016-02-05
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多