它是怎么运用的模块从子程序中?(Is it okay to use modules from wit

2019-08-08 15:54发布

最近,我开始与面向对象的Perl玩,我一直在创造相当一堆新的对象为我工作的一个新项目。 正如我unfamilliar与有关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运行,该网页不作为加载缓慢。

Answer 1:

放在哪里使用?

use发生在编译时间,所以没关系,你把它。 在从单纯的务实至少,“将它的工作”的观点。 因为它发生在编译的时候use就一定会执行,即使你把它放在一个条件。 从来没有这样做: if( $foo eq 'foo' ) { use SomeModule }

根据我的经验,最好是把所有的使用说明在文件的顶部。 它可以很容易地看到什么是被加载和你的依赖关系。


更新:

正如布莱恩d FOY指出 ,事情之前编译use声明不会受其影响。 因此,该位置可以无所谓。 对于一个典型的模块,位置并不重要,但是,如果它确实影响编译(例如它进口有原型的函数)的东西,位置也没关系。

此外, 查斯·欧文斯指出 ,它可以影响编译。 被设计来改变编译模块被称为编译指示。 编译指示,按照惯例,考虑到所有小写的名字。 这些影响只有在使用该模块的范围之内。 查斯采用integer编译作为他的回答的例子。 您也可以禁用编译或模块在与关键字范围有限, 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;

为什么你的测试脚本慢的服务器上?

有没有办法告诉你所提供的信息。

但简单的方法来找出是分析代码 ,看的时间被消耗在哪里。 NYTProf是你可能想看看另一种流行的分析工具。

最佳实践

退房Perl的最佳实践 ,和快速参考卡。 这个页面有一个很好的运行从PBP达米安Conway的OOP的建议下来 。

此外,您不妨考虑使用驼鹿 。 如果长期脚本的启动时间是在您的使用情况可以接受,那么穆斯是一个巨大的胜利。



Answer 2:

问题1

这取决于模块做什么。 如果有词法效果,那么它只会影响它使用的范围:

my $x;
{
    use integer;
    $x = 5/2; #$x is now 2
}
my $y = 5/2; #$y is now 2.5

如果是正常的模块,然后它没有什么区别,你使用它,但它通常使用所有这些模块在程序的顶部。

问题2

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

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


Answer 3:

daotoad和查斯。 欧文已经回答了有关使用报表的位置你的问题的一部分。 让我此话别的东西在这里:

我这样做,让我觉得这是在清洁的情况下,我需要游移功能。

就个人而言,我觉得它更清洁器在一个地方所有使用的模块,在该文件的顶部。 你不会有搜索使用语句查看正在使用什么其他模块和快速浏览会告诉你正在使用什么,甚至不被使用的。

关于你的性能问题:与Apache和mod_perl的Perl解释器将解析和编译使用的模块只有一次。 脚本运行下一次,执行要快很多。 在命令行,然而,第二次运行没有得到这个好处。



文章来源: Is it okay to use modules from within subroutines?