取决于是否可以加载某个模块,我想决定是否使用它:
BEGIN {
eval {
require "Bio::EnsEMBL::HDF5";
$hdf5 = "Bio::EnsEMBL::HDF5";
};
if ($@) {
require "Bio::EnsEMBL::HDF5_mockup";
$hdf5 = "Bio::EnsEMBL::HDF5_mockup";
}
}
导致
Can't locate Bio::EnsEMBL::HDF5_mockup in @INC
然而:
use Bio::EnsEMBL::HDF5;
use Bio::EnsEMBL::HDF5_mockup;
工作正常。此外,当我在BEGIN块中切换HDF5和HDF5_mockup时,它始终找到我首先需要的那个,并且找不到第二个。
感谢任何指针。
答案 0 :(得分:9)
这是因为当您使用require时引用模块时,它会使用带引号的字符串作为实际模块文件的名称。因此,它不是在寻找Bio/EnsEMBL/HDF5.pm
,而是在@INC
搜索名为Bio::EnsEMBL::HDF5
的文件。
删除引号,以便模块名称为裸字。这是一个例子:
注意模块名称是如何转换为文件路径的:
require "Data::Dumper";
Can't locate Data::Dumper in @INC (@INC contains: ...
现在,在这个例子中,我故意错误输入了模块名称,因此我可能会产生错误。注意模块是如何转换为实际文件路径的:
require Data::Dumperx;
Can't locate Data/Dumperx.pm in @INC (you may need to install the Data::Dumperx module)
答案 1 :(得分:4)
use Bio::EnsEMBL::HDF5;
几乎与
相同BEGIN {
require Bio::EnsEMBL::HDF5;
import Bio::EnsEMBL::HDF5;
}
和
# Looks for file "Bio::EnsEMBL::HDF5_mockup"
require "Bio::EnsEMBL::HDF5_mockup";
不等于
# Looks for file "Bio/EnsEMBL/HDF5_mockup.pm"
require Bio::EnsEMBL::HDF5_mockup;