2016-05-27 5 views
1


je nachdem, ob ein bestimmtes Modul verwendet zu finden, würde Ich mag, um zu entscheiden, ob es verwendet wird:Perl erfordert nicht Bibliothek in @INC wenn in eval

BEGIN { 
    eval { 
    require "Bio::EnsEMBL::HDF5"; 
    $hdf5 = "Bio::EnsEMBL::HDF5"; 
    }; 
    if ([email protected]) { 
    require "Bio::EnsEMBL::HDF5_mockup"; 
    $hdf5 = "Bio::EnsEMBL::HDF5_mockup"; 
    } 
} 

was zu
Can't locate Bio::EnsEMBL::HDF5_mockup in @INC

jedoch:

use Bio::EnsEMBL::HDF5; 
use Bio::EnsEMBL::HDF5_mockup; 

funktioniert gut. Auch wenn ich HDF5 und HDF5_mockup im BEGIN-Block umschalte, findet es immer zuerst den, den ich benötige, und finde den zweiten nicht.
Danke für jeden Zeiger.

+0

funktioniert es, wenn Sie Bareword-Modulname verwenden: 'erfordern Bio :: EnsEMBL :: HDFS;' und 'erfordern Bio :: EnsEMBL :: HDFS_mockup'? – stevieb

Antwort

9

Dies liegt daran, wenn Sie das Modul bei der Verwendung require quotieren, verwendet es die Zeichenfolge in Anführungszeichen als den Namen der tatsächlichen Moduldatei. Anstatt nach Bio/EnsEMBL/HDF5.pm zu suchen, wird nach @INC für eine Datei mit dem Namen Bio::EnsEMBL::HDF5 gesucht.

Entfernen Sie die Anführungszeichen, so dass der Modulname ein Bareword ist. Hier ein Beispiel:

Beachten Sie, wie der Modulname nicht in einen Dateipfad verwandelt:

require "Data::Dumper"; 
Can't locate Data::Dumper in @INC (@INC contains: ... 

nun in diesem Beispiel habe ich vertippt absichtlich den Namen des Moduls, so konnte ich den Fehler erzeugen . Beachten Sie, wie das Modul in einen tatsächlichen Dateipfad gewandelt:

require Data::Dumperx; 
Can't locate Data/Dumperx.pm in @INC (you may need to install the Data::Dumperx module) 
+1

Autsch. Das nicht zu sehen war ein sicheres Zeichen dafür, mit dem Programmieren aufzuhören und das Wochenende zu beginnen. Vielen Dank! – juettemann

4
use Bio::EnsEMBL::HDF5; 

fast identisch mit

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

und

# Looks for file "Bio::EnsEMBL::HDF5_mockup" 
require "Bio::EnsEMBL::HDF5_mockup"; 

ist nicht gleichbedeutend mit

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