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

mel*_*aos 6 oop perl 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;
}
Run Code Online (Sandbox Code Playgroud)

我想知道这是否会导致任何负面影响,而不是在use Object任何功能范围之外的Perl模块之上.

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

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

dao*_*oad 10

在哪里使用?

use在编译时发生,所以你把它放在哪里都没关系.至少从一个纯粹务实的,"它会起作用"的角度来看.因为它在编译时发生use将始终执行,即使你把它放在条件中.永远不要这样做:if( $foo eq 'foo' ) { use SomeModule }

根据我的经验,最好将所有使用语句放在文件的顶部.它使您可以轻松查看正在加载的内容以及您的依赖项.


更新:

正如brian d foy指出的那样,在use声明之前汇编的内容不会受到影响.所以,位置可能很重要.对于典型的模块,位置并不重要,但是,如果它执行影响编译的事情(例如,它导入具有原型的函数),则位置可能很重要.

此外,Chas Owens指出它可能会影响编译.旨在改变编译的模块称为编译指示.按照惯例,语用库在所有小写字母中都有名称.这些效果仅适用于使用模块的范围.Chas integer在他的回答中以pragma为例.您还可以使用关键字在有限范围内禁用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
Run Code Online (Sandbox Code Playgroud)

间接对象​​语法

在您的示例代码中my $obj = new ObjectX;.这称为间接对象语法,最好避免使用它,因为它可能导致模糊的错误.最好使用此表单:

my $obj = ObjectX->new;
Run Code Online (Sandbox Code Playgroud)

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

没有办法告诉您提供的信息.

但找到答案的简单方法是分析您的代码并查看消耗时间的位置. NYTProf是您可能想要查看的另一种流行的分析工具.

最佳做法

查看Perl最佳实践快速参考卡.这个页面有很好的关于Damian Conway的PBP OOP建议.

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

  • 你把它放在哪里都很重要.Perl编译的任何东西都不会从任何使用它的东西中受益.在这种情况下,这可能无关紧要,但排序通常很重要. (2认同)

Cha*_*ens 6

问题1

这取决于模块的功能.如果它有词法效果,那么它只会影响它所用的范围:

my $x;
{
    use integer;
    $x = 5/2; #$x is now 2
}
my $y = 5/2; #$y is now 2.5
Run Code Online (Sandbox Code Playgroud)

如果它是一个普通模块,那么在使用它的地方没有任何区别,但通常在程序顶部使用所有这些模块.

问题2

可能影响机器之间程序速度的事情

  1. 处理器的速度
  2. 安装的模块版本(某些模块具有更快的XS版本)
  3. Perl的版本
  4. PERL5LIB中的条目数
  5. 驱动器的速度