2009-04-13 38 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