防止perl中的多个夹杂物

时间:2013-03-07 17:59:09

标签: perl module

假设我有两个文件:一个如下所示的模块文件:

package myPackage;
use Bio::Seq;

和另一个看起来像这样的文件:

use lib "path/to/lib";
use myPackage;
use Bio::Seq;

如何防止Bio :: Seq被包含两次?感谢名单

5 个答案:

答案 0 :(得分:3)

模块不像Perl那样“包含”在Perl中。它们被“加载”,我的意思是“执行”。

一个模块只会加载/执行一次,无论有多少use个语句指定它。

对于模块的每个use,唯一发生的事情是调用模块的import方法。这通常用于将符号导出到using命名空间。

答案 1 :(得分:3)

它不会被包括两次。 use语义可以这样描述:

  1. require模块
  2. 致电模块的import
  3. 正如文档所说,它等同于:

    BEGIN { require Module; Module−>import( LIST ); }
    
    另一方面,

    require机制确保模块的代码仅编译和执行,这是第一次需要它时。此机制基于特殊变量%INC。您可以在documentation for userequireperlmod page中找到更多详细信息。

答案 2 :(得分:3)

use Foo

大致相当于


# perldoc -f use
BEGIN { 
    require "Foo.pm";
    Foo->import();
}

require "Foo"大致相当于


# perldoc -f require
sub require {
  my ($filename) = @_;
  if (exists $INC{$filename}) {
    return 1 if $INC{$filename};
    die "Compilation failed in require";
  }
  # .... find $filename in @INC
  # really load
  return do $realfilename;
}

所以

不,代码不会被“加载”多次,只能“导入”不止一次。

如果您有

等代码


package Bio::Seq;
...
sub import { 
  # fancy stuff
}

你想确保加载了一个库,但在其上调用import


#perldoc -f use
use Bio::Seq ();

答案 3 :(得分:1)

我想,您希望优化模块的加载(用法)。

为了优化,动态加载可能会有所帮助。

为了动态加载Perl模块,我们使用Class::Autouse

有关详细信息,请访问this链接。

答案 4 :(得分:1)

我想OP可能会在他/她的Perl脚本开头寻找一种避免长use语句样板列表的方法。在这种情况下,我想将每个人都指向Import::Into。它的工作方式类似于Java和Python中的关键字import。此外,this blog post提供了Import::Into的精彩演示。