2009-09-23 29 views
10

Tôi không biết làm thế nào để làm một điều trong Perl và tôi cảm thấy tôi đang làm một cái gì đó về cơ bản sai.Làm cách nào để tải tệp có liên quan đến đường dẫn mô-đun?

Tôi đang thực hiện một dự án lớn hơn, vì vậy tôi chia nhiệm vụ thành các mô-đun khác nhau. Tôi đặt các mô-đun vào thư mục dự án, trong thư mục con "modules /" và thêm thư mục này vào PERL5LIB và PERLLIB.

Tất cả các mô-đun này sử dụng một số cấu hình, được lưu trong tệp bên ngoài trong thư mục dự án chính - "../configure.yaml" nếu bạn nhìn vào nó từ phối cảnh tệp mô-đun. Tuy nhiên, ngay bây giờ, khi tôi sử dụng mô-đun thông qua "sử dụng", tất cả các đường dẫn tương đối trong mô-đun được lấy từ thư mục hiện tại của tập lệnh bằng cách sử dụng các mô-đun này, chứ không phải từ thư mục của chính mô-đun đó. Ngay cả khi tôi sử dụng FindBin hay bất cứ thứ gì.

Làm cách nào để tải tệp, liên quan từ đường dẫn mô-đun? Điều đó thậm chí có thể/được khuyến khích?

Trả lời

13

Cửa hàng Perl nơi mô-đun được tải từ trong% INC băm. Bạn có thể tải mọi thứ liên quan đến rằng:

package Module::Foo; 
use File::Spec; 
use strict; 
use warnings; 

my ($volume, $directory) = File::Spec->splitpath($INC{'Module/Foo.pm'}); 
my $config_file = File::Spec->catpath($volume, $directory, '../configure.yaml'); 

% phím INC được dựa trên một bản dịch nghiêm ngặt của :: đến/với .pm nối, ngay cả trên Windows, VMS vv

Lưu ý rằng các giá trị trong% INC có thể liên quan đến thư mục hiện tại nếu bạn đặt các thư mục tương đối trong @INC, vì vậy hãy cẩn thận nếu bạn thay đổi các thư mục giữa yêu cầu/sử dụng và kiểm tra% INC.

+0

và cảm ơn bạn, quá. –

-3

Thay đổi số gọi use Module của bạn thành require Module (hoặc require Module; Module->import(LIST)). Sau đó, sử dụng trình gỡ rối để thực hiện quá trình tải mô-đun và xem nơi Perl nghĩ rằng nó đang tải các tệp từ đó.

+2

tốt, tôi không nghĩ rằng đó là một lỗi trong chương trình của tôi - Tôi chỉ không biết, làm thế nào để viết nó :) nếu tôi chỉ viết, ví dụ, LoadFile ("../ configure.yaml"); vào mô-đun và tôi sử dụng mô-đun THAT trong một tập lệnh ở một nơi khác, Perl chỉ sử dụng nó làm đường dẫn tương đối từ tệp tập lệnh, KHÔNG phải tệp mô-đun. Yêu cầu hoặc gỡ lỗi là không thực sự giúp đỡ, tôi BIẾT nơi mà vấn đề là, tôi chỉ không biết phải làm gì với nó –

8

Bảng toàn cầu %INC chứa mục nhập cho mỗi mô-đun bạn có use 'd hoặc require' d, được kết hợp với địa điểm mà Perl đã tìm thấy mô-đun đó.

use YAML; 
print $INC{"YAML.pm"}; 

>> /usr/lib/perl5/site_perl/5.8/YAML.pm 

Điều đó có hữu ích hơn không?

+0

Vâng, nó là .. cảm ơn bạn :) –

9

Có một mô-đun được gọi là File::ShareDir tồn tại để giải quyết vấn đề này. Bạn đang đi đúng hướng để tìm FindBin, nhưng FindBin luôn tìm thấy chương trình đang hoạt động, không phải mô-đun đang sử dụng nó. ShareDir làm điều gì đó khá giống với giải pháp của ysth, ngoại trừ gói gọn trong một giao diện đẹp.

Cách sử dụng cũng đơn giản như

my $filename = File::ShareDir::module_file(__PACKAGE__, 
    'my/data.txt'); 
# and then open $filename or whatever else. 

hoặc

my $dirname = File::ShareDir::module_dir(__PACKAGE__); 
# Play ball! 
Các vấn đề liên quan