最近我开始使用 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/