假设我有两个文件:一个如下所示的模块文件:
package myPackage;
use Bio::Seq;
和另一个看起来像这样的文件:
use lib "path/to/lib";
use myPackage;
use Bio::Seq;
如何防止Bio :: Seq被包含两次?感谢名单
答案 0 :(得分:3)
模块不像Perl那样“包含”在Perl中。它们被“加载”,我的意思是“执行”。
一个模块只会加载/执行一次,无论有多少use
个语句指定它。
对于模块的每个use
,唯一发生的事情是调用模块的import
方法。这通常用于将符号导出到using命名空间。
答案 1 :(得分:3)
它不会被包括两次。 use
语义可以这样描述:
require
模块import
正如文档所说,它等同于:
BEGIN { require Module; Module−>import( LIST ); }
另一方面, require
机制确保模块的代码仅编译和执行,这是第一次需要它时。此机制基于特殊变量%INC
。您可以在documentation for use
,require
和perlmod 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)
答案 4 :(得分:1)
我想OP可能会在他/她的Perl脚本开头寻找一种避免长use
语句样板列表的方法。在这种情况下,我想将每个人都指向Import::Into
。它的工作方式类似于Java和Python中的关键字import
。此外,this blog post提供了Import::Into
的精彩演示。