2012-06-22 16 views
9

Bir perl sorunum var: @INC ve use deyimindeki yol öğelerine bağlı olarak sembolleri içe aktarma.perl: İhracatçı, "use" ifadesindeki yol öğeleriyle çalışmaz

Tüm yolu @INC içine koyarsam, içe aktarma çalışır. yolunun bir parçası use açıklamada ise ithalat modül yürütüldüğünde, ancak ithalat açıkça yapılmalıdır:

######################################## 
# @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 
#------------------------------------------------- 

benim hatam nedir?

cevap

10

Eğer

use Foo; 

bu eşdeğerdir derken: Eğer use impex::ex, Perl örtük impex::ex->import yaptığında bu nedenle, ex ismini vermek

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

Sen ex.pm paketi tanımladıktan . Ancak impex::ex adında bir paket yoktur, bu nedenle sembollerinizi almak için içe aktarmayı ex'dan elle yapmanız gerekir.

Bunu yapmanın doğru yolu, modüllerinizi @INC içinde varolan bir dizinin altına koymak ve paketi @INC dizinine göre tam yol adından sonra adlandırmaktır. Yani impex/ex.pm, package impex::ex; ile başlamalı ve bu şekilde use olmalıdır.

Paket adları uzun ve hantal olmaktan endişe ediyorsanız, aliased'a bakın.

+1

Hızlı yanıt için teşekkür ederiz. Ama daha önce neden bu problemi anlamadığımı anlamıyorum. Çok fazla modül var, e. g. Lib/Foto'da FotoArchive.pm ', FotoArchive ve Foto ismi ile @INC yolunda değil. Neden Foto :: FotoArchive aracılığıyla onları çağırdığımda neden aynı sorunlara neden olmaz? - Ah, görmeye başladım, çünkü hiçbir şey ihraç etmiyorlar. Bu yüzden çok uzun zamandır fark edilmediğim hatamdan kurtuldum! Teşekkür ederim! – Sadko