Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl模块知道它安装在哪里吗?_Perl_Templates_Module - Fatal编程技术网

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

Perl模块知道它安装在哪里吗?,perl,templates,module,Perl,Templates,Module,我已经开始创建一个包含默认电子邮件模板的Perl包 清单看起来像: SendMyEmail.pm SendMyEmail/defualt_email.tt 目前我知道模块(和模板)在哪里,但模块本身知道它在磁盘上的位置吗?那么,没有我的帮助,模块能否找到默认模板 # This is what I would like to do. package SendMyEmail; sub new { my ($self, $template) = @_; $template ||= $

我已经开始创建一个包含默认电子邮件模板的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模块的引用都是受欢迎的


提前感谢。

重写以反映我在评论中学到的内容:

  • 查找模块的路径

    package FooBar;
    
    use File::Spec;
    sub location  {
    return File::Spec->rel2abs( __FILE__);
    }
    
  • 模板的放置位置:

    由于模板很可能是可编辑的,甚至可能是通过网络工作的人,我强烈建议将其放入一个目录中,其中包含的“代码”无法执行

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


每个perl文件都可以访问变量
\uuuuu file\uuuuu
,该变量告诉它它的完整路径。像这样的事情应该可以做到:

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

不过,如果您只想将“数据”文件与模块捆绑在一起,那么请查看哪种方式提供了这样做的方法。

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

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

您可以使用
\uuu文件\uuu
标记获取当前文件的名称(包括路径)。如果您想知道不同模块(已加载的模块)的路径,请检查
%INC
哈希的内容。

如果文件与包名不完全匹配,则使用%INC可能会产生误导。(这是一种反模式,但确实会发生,有时是出于合理的原因。)如果您想定位文件,最好使用方便的令牌。可定位自身的示例模块:

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";

我使用此bash别名查找模块的位置(例如,查看其实现或插入一些调试打印语句):

$perlwhere测试::更多 /usr/lib/perl5/5.8.8/Test/More.pm
FindBin只会给出启动的perl脚本的位置(即.pl文件),而不是调用FindBin的文件的位置。这一点很好!显然我没有仔细阅读这个问题!唉,文件也不会返回完整路径,似乎“只”返回相对于脚本的路径。骆驼书(古代版本)也不具体。使用File::Spec的rel2abs()可以获得完整路径:File::Spec::rel2abs(File)谢谢potyl和mpeters,我已经根据您的输入改写了我的答案。好的,我将投票结束这个问题。无法删除它,因为答案是向上投票的。请注意,上面的这两条评论来自一个重复问题,该问题现已合并到此问题中,因此不再准确。问题中的示例子项名为“findmyself”,并使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
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