2012-06-22 9 views
9

Mam problem z perl: importowanie symboli, w zależności od elementów ścieżki w @INC i instrukcji use.perl: Exporter nie działa z elementami ścieżki w instrukcji `use`

Jeśli wstawię pełną ścieżkę do @INC, import działa. Jeżeli część ścieżki jest w rachunku use moduł do importu jest wykonywana, ale import musi być zrobione wyraźnie:

######################################## 
# @INC has: "D:/plu/lib/" 

#------------------------------------------------ 
# Exporting file is here: "D:/plu/lib/impex/ex.pm" 
# 
use strict; 
use warnings; 
package ex; 

use Exporter; 
our @ISA = 'Exporter'; 
our @EXPORT = qw(fnQuark); 

sub fnQuark { print "functional quark\n"; } 

print "Executing module 'ex'\n"; 
1; 

#------------------------------------------------ 
# Importing file, example 1, is here: "D:/plu/lib/impex/imp.pl" 
# 
use strict; 
use warnings; 
package imp; 

use impex::ex; 

ex->import(@ex::EXPORT); # removing this line makes fnQuark unavailable! 
           # Why is this necessary, 'ex.pm' being an Exporter? 
fnQuark(); 

#------------------------------------------------ 
# Importing file, example 2, is here: "D:/plu/lib/impex/imp2.pl" 
# 
use strict; 
use warnings; 
package imp2; 

use lib 'D:/plu/lib/impex'; 
use ex; 

fnQuark();     # works without explicit import 
#------------------------------------------------- 

Jaki jest mój błąd?

Odpowiedz

10

Kiedy mówisz

use Foo; 

jest to równoznaczne z:

BEGIN { 
    require 'Foo.pm'; 
    Foo->import; 
}; 

pan zdefiniował pakiet w ex.pm być nazwany ex, więc kiedy use impex::ex, Perl czy niejawny impex::ex->import . Ale nie ma pakietu o nazwie impex::ex, więc aby uzyskać symbole, musisz ręcznie zaimportować dane z ex.

Prawidłowym sposobem wykonania tej czynności jest umieszczenie modułów w istniejącym katalogu pod numerem @INC i nazwanie pakietu po pełnej nazwie ścieżki względem katalogu @INC. Tak więc Twój impex/ex.pm powinien zaczynać się od package impex::ex; i tak powinieneś use go.

Jeśli obawiasz się, że nazwy pakietów są długie i nieporęczne, przejrzyj aliased.

+1

Dziękuję za szybką odpowiedź. Ale nie rozumiem, dlaczego wcześniej nie miałem takiego problemu. Mam tyle modułów, np. sol. "FotoArchive.pm" w lib/Foto, z nazwą pakietu FotoArchive i Foto nie w ścieżce @INC. Dlaczego nie powoduje to tych samych problemów, gdy przywołuję je za pomocą Foto :: FotoArchive? - Ach, zaczynam widzieć, bo nie eksportują niczego. Więc od tak dawna uniknąłem mojego błędu niezauważony! Dziękuję Ci! – Sadko

Powiązane problemy