我已经开始创建一个包含默认电子邮件模板的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模块做类似的事情将是受欢迎的。
先谢谢你。
7条答案
按热度按时间db2dz4w81#
每个perl文件都可以访问变量
__FILE__
,该变量告诉它它的完整路径。不过,如果你只想把“数据”文件和你的模块捆绑在一起,那么看看File::ShareDir,它提供了一种实现这一点的方法。
oyt4ldly2#
如果文件与包名不完全匹配,使用%INC可能会产生误导。(这是一个反模式,但有时确实会发生,原因是合理的。)如果您想定位文件,方便的
__FILE__
标记是您的最佳选择。可以定位自身的示例模块:用法:
oug3syen3#
如果模块已加载,则可以使用
%INC
哈希。例如:pdkcd3nj4#
Perl也在
%INC
变量中记录了文件位置。当__FILE__
不可用时,你可以使用它。有关详细信息,请参阅perlvar中的文档。3df52oht5#
重写,以反映我在评论中学到的东西:
*查找模块路径
*放置模板的位置:
由于模板很可能是可编辑的,甚至可能是通过网络工作的人,我强烈建议将它放在模板中包含的“代码”无法执行的目录中。
想象有人在叫:
http://your.home.net/cgi-bin/default_email.tt
s5a0g9ez6#
你可以使用
__FILE__
标记来获取当前文件的名称(包括路径)。如果你想知道另一个模块(已经加载的模块)的路径,请检查%INC
哈希的内容。vd2z7a6w7#
我使用这个bash别名来查找模块的位置(例如,查看它的实现或破解一些调试打印语句):
第一个