Perl模块知道它安装在哪里吗?

798qvoo8  于 2022-11-15  发布在  Perl
关注(0)|答案(7)|浏览(252)

我已经开始创建一个包含默认电子邮件模板的Perl包。
MANIFEST类似于:

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模块做类似的事情将是受欢迎的。
先谢谢你。

db2dz4w8

db2dz4w81#

每个perl文件都可以访问变量__FILE__,该变量告诉它它的完整路径。

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

不过,如果你只想把“数据”文件和你的模块捆绑在一起,那么看看File::ShareDir,它提供了一种实现这一点的方法。

oyt4ldly

oyt4ldly2#

如果文件与包名不完全匹配,使用%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";
oug3syen

oug3syen3#

如果模块已加载,则可以使用%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);
pdkcd3nj

pdkcd3nj4#

Perl也在%INC变量中记录了文件位置。当__FILE__不可用时,你可以使用它。有关详细信息,请参阅perlvar中的文档。

3df52oht

3df52oht5#

重写,以反映我在评论中学到的东西:

*查找模块路径

package FooBar;

use File::Spec;
sub location  {
return File::Spec->rel2abs( __FILE__);
}

*放置模板的位置:

由于模板很可能是可编辑的,甚至可能是通过网络工作的人,我强烈建议将它放在模板中包含的“代码”无法执行的目录中。
想象有人在叫:http://your.home.net/cgi-bin/default_email.tt

s5a0g9ez

s5a0g9ez6#

你可以使用__FILE__标记来获取当前文件的名称(包括路径)。如果你想知道另一个模块(已经加载的模块)的路径,请检查%INC哈希的内容。

vd2z7a6w

vd2z7a6w7#

我使用这个bash别名来查找模块的位置(例如,查看它的实现或破解一些调试打印语句):
第一个

相关问题