1

假设我有两个文件:一个看起来像这样的模块文件:

package myPackage;
use Bio::Seq;

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

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

我怎样才能防止 Bio::Seq 被包含两次?谢谢

4

5 回答 5

3

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

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

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

于 2013-03-07T18:06:00.837 回答
3

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

  1. require模块
  2. 调用模块的import

正如文档所说,它相当于:

BEGIN { require Module; Module−>import( LIST ); }

require另一方面,机制确保模块的代码只编译和执行一次,有些人第一次需要它。这种机制是基于特殊变量的%INC。您可以在 、 和 perlmod 页面的文档中找到更多use详细信息。require

于 2013-03-07T18:16:19.333 回答
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 ();
于 2013-03-07T18:18:58.727 回答
1

我猜,你想优化Module的加载(使用)。

对于优化,动态加载可能会有所帮助。

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

有关更多详细信息,您可以访问链接。

于 2013-03-07T18:14:48.343 回答
1

use我猜 OP 可能会寻找一种方法来避免在他/她的 Perl 脚本开头出现一长串语句样板。在这种情况下,我想向大家指出Import::Into. 它的工作方式类似于 Java 和 Python 中的关键字import。此外,这篇博文还提供了一个精彩的Import::Into.

于 2017-02-28T18:10:37.580 回答