2009-04-13 17 views
7

Tôi đã bắt đầu tạo một gói Perl chứa mẫu email mặc định.Mô-đun Perl có biết nơi nó được cài đặt không?

Các MANIFEST trông giống như sau:

SendMyEmail.pm 
SendMyEmail/defualt_email.tt 

Hiện nay tôi biết được nơi các mô-đun (và các mẫu) là - nhưng các module chính nó biết nơi trên đĩa nó là gì? Vì vậy, các mô-đun có thể tìm thấy các mẫu mặc định mà không cần sự giúp đỡ của tôi?

# This is what I would like to do. 
package SendMyEmail; 
sub new { 
    my ($self, $template) = @_; 
    $template ||= $dir_of_SendMyEmail .'/SendMyEmail/default_email.tt'; # ?? 
} 

Có cách nào tốt hơn để bao gồm văn bản mẫu hay vị trí tốt hơn để đặt mẫu không?

Mọi tham chiếu đến các mô-đun CPAN làm điều gì đó tương tự sẽ được hoan nghênh.

Xin cảm ơn trước.

+0

OK, tôi sẽ bỏ phiếu để đóng câu hỏi. Không thể xóa nó vì câu trả lời được bình chọn. –

+0

Lưu ý rằng hai chú thích ở trên là từ câu hỏi song ngữ hiện đã được hợp nhất thành câu hỏi này và do đó không còn chính xác nữa. – Ether

Trả lời

9

Mỗi file perl có quyền truy cập vào biến __FILE__ mà nói với nó đường dẫn đầy đủ của nó. Một cái gì đó như thế này nên làm như lừa:

my $DEFAULT_TEMPLATE; 
BEGIN { 
    $DEFAULT_TEMPLATE = __FILE__; 
    $DEFAULT_TEMPLATE =~ s,\.pm$,/default_email.tt,; 
} 

Tuy nhiên, nếu tất cả các bạn muốn là để bó files 'dữ liệu' với các module của bạn thì hãy nhìn vào File::ShareDir cung cấp một cách để làm điều đó.

+0

__FILE__ được mô tả trong perldata. http://perldoc.perl.org/perldata.html – CoffeeMonster

2

Viết lại để phản ánh những gì tôi học được trong các ý kiến:

  • Tìm Đường dẫn Mô-đun của

    package FooBar; 
    
    use File::Spec; 
    sub location { 
    return File::Spec->rel2abs(__FILE__); 
    } 
    
  • Nơi để đặt mẫu:

    Kể từ khi mẫu sẽ nhiều khả năng có thể chỉnh sửa được, thậm chí có thể bởi một người làm việc trên mạng, tôi ongly khuyên đưa nó vào một thư mục mà "mã" chứa trong mẫu không thể được thực hiện.

    Hãy tưởng tượng một ai đó gọi: http://your.home.net/cgi-bin/default_email.tt

+0

FindBin sẽ chỉ cung cấp cho bạn vị trí của tập lệnh perl đã được bắt đầu (tệp .pl) không phải là vị trí của tệp gọi hàm FindBin. – potyl

+0

Điểm tốt! Rõ ràng là tôi không đọc đủ câu hỏi! – lexu

+0

Than ôi, __FILE__ không trả lại đường dẫn đầy đủ, 'có vẻ' đường dẫn tương đối so với tập lệnh, có vẻ như vậy. Cuốn sách lạc đà (bản sao cổ) cũng không cụ thể. – lexu

3

Perl cũng ghi lại vị trí tệp trong biến% INC. Bạn có thể sử dụng điều đó khi __FILE__ không khả dụng. Xem tài liệu ở số perlvar để biết chi tiết.

5

Bạn có thể sử dụng hàm băm %INC nếu mô-đun đã được tải. Ví dụ:

## load the module 
use Data::Dumper; 

## output full path to Data::Dumper module loaded 
print $INC{'Data/Dumper.pm'}; 

## see which module was loaded (if you have multiple folders with same modules) 
print Dumper(\%INC); 
1

Bạn có thể sử dụng mã thông báo __FILE__ để nhận tên (bao gồm đường dẫn) của tệp hiện tại. Nếu bạn muốn biết đường dẫn đến một mô-đun khác (mô-đun đã được tải), hãy kiểm tra nội dung của hàm băm %INC.

7

Sử dụng% INC có thể gây hiểu lầm trong trường hợp tệp không khớp chính xác với tên gói. (Đây là một mô hình chống, nhưng nó xảy ra, đôi khi cho các lý do chính đáng.) Nếu bạn muốn xác định vị trí các tập tin, các __FILE__ mã thông báo tiện dụng là đặt cược tốt nhất của bạn.Ví dụ mô-đun có thể xác định vị trí riêng của mình:

package Foo::Bar; 

use Cwd qw(abs_path); 
use File::Basename qw(dirname); 

sub module_dir { abs_path(dirname(__FILE__)) } 

1; 

Cách sử dụng:

use Foo::Bar; 

print Foo::Bar->module_dir, "\n"; 
+0

Điều này sẽ không hoạt động đối với các mô-đun bạn không thể kiểm soát –

+2

Ví dụ phụ trong câu hỏi có tên là "findmyself" và sử dụng '__PACKAGE__', vì vậy tôi nghĩ rằng kiểm soát mô-đun là một giả định an toàn. –

1

tôi sử dụng bash bí danh này để tìm vị trí của một module (ví dụ như để nhìn vào thực hiện nó hay hack trong một số báo cáo gỡ lỗi in):

perlwhere() { 
    perl -wle'eval "require $ARGV[0]" or die; ($mod = $ARGV[0]) =~ s|::|/|g; print $INC{"${mod}.pm"}' $1 
} 
 
$ perlwhere Test::More 
/usr/lib/perl5/5.8.8/Test/More.pm 
Các vấn đề liên quan