在eval中使用时,Perl要求无法在@INC中找到库

时间:2016-05-27 14:39:11

标签: perl


取决于是否可以加载某个模块,我想决定是否使用它:

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时,它始终找到我首先需要的那个,并且找不到第二个。
感谢任何指针。

2 个答案:

答案 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;