2012-06-22 29 views
9

Tôi gặp sự cố perl: nhập biểu tượng, tùy thuộc vào các phần tử đường dẫn trong @INC và câu lệnh use.perl: Trình xuất không hoạt động với các phần tử đường dẫn trong câu lệnh `use`

Nếu tôi đặt đường dẫn đầy đủ vào @INC, quá trình nhập sẽ hoạt động. Nếu một phần của con đường là trong báo cáo use module để nhập khẩu được thực thi, nhưng việc nhập khẩu phải được thực hiện một cách rõ ràng:

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

sai lầm của tôi là gì?

Trả lời

10

Khi bạn nói

use Foo; 

này tương đương với:

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

Bạn đã xác định các gói trong ex.pm của bạn được đặt tên ex, vì vậy khi bạn use impex::ex, Perl làm một tiềm ẩn impex::ex->import . Nhưng không có gói nào có tên là impex::ex, vì vậy bạn phải nhập thủ công từ ex để nhận biểu tượng của mình.

Cách chính xác để thực hiện việc này là đặt mô-đun của bạn trong thư mục hiện có trong @INC và đặt tên gói sau tên đường dẫn đầy đủ tương ứng với thư mục @INC. Vì vậy, impex/ex.pm của bạn nên bắt đầu bằng package impex::ex; và đó là cách bạn nên use nó.

Nếu bạn lo lắng về tên gói dài và khó sử dụng, hãy xem aliased.

+1

Cảm ơn bạn đã trả lời nhanh. Nhưng tôi không hiểu tại sao tôi không có vấn đề này trước đây. Tôi có rất nhiều mô-đun, e. g. 'FotoArchive.pm' trong lib/Foto, với tên gói FotoArchive và Foto không nằm trong đường dẫn @INC. Tại sao điều đó không gây ra vấn đề tương tự khi tôi gọi chúng thông qua Foto :: FotoArchive? - Ah, tôi bắt đầu thấy, bởi vì họ không xuất khẩu bất cứ thứ gì. Vì vậy, tôi đã đi với sai lầm của tôi không được chú ý quá lâu! Cảm ơn bạn! – Sadko

Các vấn đề liên quan