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

在eval中使用Perl require时,无法在@INC中找到库,perl,Perl,根据是否可以加载某个模块,我想决定是否使用该模块: BEGIN { eval { require "Bio::EnsEMBL::HDF5"; $hdf5 = "Bio::EnsEMBL::HDF5"; }; if ($@) { require "Bio::EnsEMBL::HDF5_mockup"; $hdf5 = "Bio::EnsEMBL::HDF5_mockup"; } } 这将导致 在@INC中找不到Bio::EnsEMBL::HDF5\


根据是否可以加载某个模块,我想决定是否使用该模块:

BEGIN {
  eval {
    require "Bio::EnsEMBL::HDF5";
    $hdf5 = "Bio::EnsEMBL::HDF5";
  };
  if ($@) {
    require "Bio::EnsEMBL::HDF5_mockup";
    $hdf5 = "Bio::EnsEMBL::HDF5_mockup";
  }
}
这将导致
在@INC中找不到Bio::EnsEMBL::HDF5\u实体模型

然而:

use Bio::EnsEMBL::HDF5; 
use Bio::EnsEMBL::HDF5_mockup;
很好。此外,当我在BEGIN块中切换HDF5和HDF5_实体模型时,它始终会找到我需要的第一个实体模型,但找不到第二个。

感谢您提供的任何指针。

这是因为当您在使用时引用模块时,它将引用的字符串用作实际模块文件的名称。因此,它不是在寻找
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)
现在,在这个例子中,我故意输入了错误的模块名,以便产生错误。请注意模块是如何转换为实际文件路径的:

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)

这是因为在使用时引用模块时,它将引用的字符串用作实际模块文件的名称。因此,它不是在寻找
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)
现在,在这个例子中,我故意输入了错误的模块名,以便产生错误。请注意模块是如何转换为实际文件路径的:

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)
几乎与

BEGIN {
   require Bio::EnsEMBL::HDF5; 
   import Bio::EnsEMBL::HDF5; 
}

不等于

# Looks for file "Bio/EnsEMBL/HDF5_mockup.pm"
require Bio::EnsEMBL::HDF5_mockup;
几乎与

BEGIN {
   require Bio::EnsEMBL::HDF5; 
   import Bio::EnsEMBL::HDF5; 
}

不等于

# Looks for file "Bio/EnsEMBL/HDF5_mockup.pm"
require Bio::EnsEMBL::HDF5_mockup;

如果您使用裸字模块名:
require Bio::EnsEMBL::HDFS,它是否有效
要求Bio::EnsEMBL::HDFS_实体模型
?如果使用裸字模块名称,它是否有效:
要求Bio::EnsEMBL::HDFS
需要Bio::EnsEMBL::HDFS\u实体模型
?哎哟。看不到这一点是停止编码并开始周末生活的必然迹象。谢谢哎哟看不到这一点是停止编码并开始周末生活的必然迹象。谢谢