perl - 可以在子程序中使用模块吗?

标签 perl oop module-management

最近我开始使用 OO Perl,并且我一直在为我正在处理的一个新项目创建大量新对象。因为我不熟悉任何关于 OO Perl 的最佳实践,我们很乐意完成它:P

我将大量此类代码放入我的每个函数中:

sub funcx{
    use ObjectX; # i don't declare this on top of the pm file 
                 # but inside the function itself
    my $obj = new ObjectX;
}

我想知道与使用 use Object 相比,这是否会造成任何负面影响。在任何函数范围之外的 Perl 模块顶部的行。

我这样做是为了让我觉得它更干净,以防我需要改变功能。

我注意到的另一件事是,当我尝试在 unix 服务器本身上运行 test.pl 脚本来测试我的对象时,它的速度非常慢。但是,当通过连接到 apache 服务器的 CGI 运行相同的代码时,网页的加载速度不会那么慢。

最佳答案

用在什么地方?
use发生在编译时,所以你把它放在哪里都没有关系。至少从纯粹实用的角度来看,“它会起作用”。因为它发生在编译时use将始终执行,即使您将其置于条件中。永远不要这样做:if( $foo eq 'foo' ) { use SomeModule }
根据我的经验,最好将所有使用语句放在文件顶部。它可以轻松查看正在加载的内容以及您的依赖项。

更新:

brian d foy points out ,之前编译的东西use声明不会受到它的影响。因此,位置可能很重要。对于典型的模块,位置无关紧要,但是,如果它做了影响编译的事情(例如,它导入具有原型(prototype)的函数),则位置可能很重要。

另外,Chas Owens points out它会影响编译。旨在改变编译的模块称为 pragma。按照惯例,pragma 的名称都是小写的。这些效果仅适用于使用模块的范围内。 Chas 使用 integer pragma 作为他的回答中的一个例子。您还可以使用关键字 no 在有限范围内禁用编译指示或模块。 .

use strict;
use warnings;

my $foo;
print $foo;  # Generates a warning

{   no warnings 'unitialized`;  # turn off warnings for working with uninitialized values.

    print $foo;  # No warning here
}
print $foo; # Generates a warning

间接对象​​语法

在您的示例代码中,您有 my $obj = new ObjectX; .这称为间接对象语法,最好避免使用,因为它会导致难以理解的错误。最好使用这种形式:
my $obj = ObjectX->new;

为什么您的测试脚本在服务器上运行缓慢?

您提供的信息无法判断。

但是找到的简单方法是profile your code并查看时间消耗在哪里。 NYTProf是您可能想要查看的另一种流行的分析工具。

最佳实践

查看 Perl Best Practices ,以及 quick reference卡片。本页有 a nice run down of Damian Conway's OOP advice from PBP .

此外,您不妨考虑使用 Moose .如果您可以接受较长的脚本启动时间,那么 Moose 是一个巨大的胜利。

关于perl - 可以在子程序中使用模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457796/

相关文章:

javascript - 如何有效地管理 Perl 模块以实现代码重用?

Perl 开关没有正确通过?

linux - 如何从 Linux 查询 Windows 注册表项?

python - 适用于 Windows 的最佳 Python 模块管理器

oop - OOD/OOP 练习曲/代码练习

java - 我们可以使用反射调用抽象类的私有(private)方法吗?

perl - 如何让空值成为空值而不是散列?

Perl 脚本生成所有字符(包括非字母): How do I transform a number into base 27?

c++ - 类的类持有 vector