2009-04-13 74 views
7

我已經開始創建一個包含默認電子郵件模板的Perl包。Perl模塊是否知道它的安裝位置?

的清單看起來像:

SendMyEmail.pm 
SendMyEmail/defualt_email.tt 

目前我知道那裏的模塊(和模板)是 - 但模塊本身知道磁盤上它是什麼?那麼模塊能否在沒有我的幫助的情況下找到默認模板?

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

是否有更好的方式來包含模板文本或更好的地方放置模板?

任何對CPAN模塊的引用都是值得歡迎的。

在此先感謝。

+0

OK,我會投票關閉的問題。無法刪除它,因爲upvoted的答案。 – 2009-12-03 14:51:29

+0

請注意,上面的這兩個評論來自一個已經合併到這個問題中的重複問題,因此不再準確。 – Ether 2009-12-04 21:45:58

回答

9

每個perl的文件訪問的變量__FILE__告訴它的完整路徑。這樣的事情應該做的伎倆:

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

不過,如果你想要的是捆綁「數據」文件與您的模塊,然後看看File::ShareDir它提供了這樣做的一種方式。

2

重寫,以反映我在評論中瞭解到:

  • 查找模塊的路徑

    package FooBar; 
    
    use File::Spec; 
    sub location { 
    return File::Spec->rel2abs(__FILE__); 
    } 
    
  • 如果把模板:

    因爲模板會最有可能是可編輯的,甚至可能是通過網絡上的某個人工作,我想ongly建議將其放入模板中包含的「代碼」無法執行的目錄中。

    想象有人喊:http://your.home.net/cgi-bin/default_email.tt

+0

FindBin只會爲您提供已啓動的perl腳本(.pl文件)的位置而不是調用FindBin的文件的位置。 – potyl 2009-04-13 06:31:29

+0

好點!很明顯,我沒有仔細閱讀這個問題! – lexu 2009-04-13 08:20:01

3

Perl也將文件位置記錄在%INC變量中。當__FILE__不可用時,您可以使用它。有關詳細信息,請參閱perlvar中的文檔。

5

如果模塊已經加載,則可以使用%INC散列。例如:

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

您可以使用__FILE__令牌來獲取當前文件的名稱(包括路徑)。如果您想知道不同模塊(已經加載的模塊)的路徑,請檢查%INC散列的內容。

7

在文件與包名不完全匹配的情況下,使用%INC可能會引起誤解。 (這是一種反模式,但它確實發生,有時候是出於正當理由。)如果您想查找文件,方便的__FILE__令牌是您最好的選擇。例如模塊,可以定位自己:

package Foo::Bar; 

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

sub module_dir { abs_path(dirname(__FILE__)) } 

1; 

用法:

use Foo::Bar; 

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

我用這個bash的別名找到一個模塊的位置(例如,看一下它的執行或在一些調試打印語句破解):

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