代码之家  ›  专栏  ›  技术社区  ›  CoffeeMonster

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

  •  7
  • CoffeeMonster  · 技术社区  · 17 年前

    清单看起来像:

    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'; # ??
    }
    

    是否有更好的方法包含模板文本,或者有更好的地方放置模板?

    提前谢谢。

    7 回复  |  直到 17 年前
        1
  •  9
  •   Emmanuel Rodriguez    17 年前

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

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

    File::ShareDir

        2
  •  7
  •   John Siracusa    16 年前

    在文件与包名不完全匹配的情况下,使用%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";
    
        3
  •  5
  •   Ivan Nevostruev    16 年前

    你可以用 %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);
    
        4
  •  3
  •   brian d foy    17 年前

    perlvar 详情请参阅。

        5
  •  2
  •   Jason Plank Maksim Kondratyuk    14 年前

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

    • 查找模块的路径

      package FooBar;
      
      use File::Spec;
      sub location  {
      return File::Spec->rel2abs( __FILE__);
      }
      
    • 由于模板很可能是可编辑的,甚至可能是通过网络工作的人,我强烈建议将其放入一个目录中,其中包含的“代码”无法执行。

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

        6
  •  1
  •   Michael Carman    16 年前

    __FILE__ 令牌以获取当前文件的名称(包括路径)。如果您想知道不同模块(已加载的模块)的路径,请检查 %INC

        7
  •  1
  •   Ether    16 年前

    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