Perl use/require abolute path?

狂风中的少年 提交于 2019-12-22 05:29:12

问题


If I have a .pm file, is there a way I can use it, without placing it on my @INC path? I think that would be clearer in my particular use case - clearer than using relative paths or adding this directory to @INC.

Edit: Clarification:

I was hoping to avoid the necessity to iterate through every item in @INC, and instead specify directly which file I am interested in. For example, in Node.JS, require('something') will search the list of paths, but require('/specific/something') will go directly where I tell it to.

In Perl, I am not certain that this is the same functionality found in require, but it seems to work.

However, use statements require barewords. That has left me a little stumped on how to enter an absolute path.


回答1:


As per discussion in comments, I would suggest using require itself. Like below,

require "pathto/module/Newmodule.pm";

Newmodule::firstSub();

Also you can use other options as below

  • use lib 'pathto/module'; This line needs to be added to every file you want to use the module in.

use lib 'pathto/module';
use Newmodule;

  • using PERL5LIB environment variable. Set this on command line using export or add this to ~/.bashrc so that with every login it will be added to your @INC. Remember PERL5LIB adds directory before all @INC directories. So it will be used first. Also you can set it in apache httpd.conf using

    SetEnv PERL5LIB /fullpath/to/module
    
  • Or set it in BEGIN block.




回答2:


You can use this :

use lib '/path/to/Perl_module_dir'; # can be both relative or absolute
use my_own_lib;

You can modify @INC by yourself (temporarily, no fear, that's what use lib does too) :

BEGIN{ @INC = ( '/path/to/Perl_module_dir', @INC ); } # relative or absolute too
use my_own_lib;



回答3:


Generally speaking, set the PERL5LIB environment var.

export PERL5LIB=/home/ikegami/perl/lib

If the module to find is intended to be installed in a directory relative to the script, use the following:

use FindBin qw( $RealBin );
use lib $RealBin;
  # or
use lib "$RealBin/lib";
  # or
use lib "$RealBin/../lib";

This will correctly handle symbolic links to the script.

$ mkdir t

$ cat >t/a.pl
use FindBin qw( $RealBin );
use lib $RealBin;
use Module;

$ cat >t/Module.pm
package Module;
print "Module loaded\n";
1;

$ ln -s t/a.pl

$ perl a.pl
Module loaded



回答4:


You can use the Module::Load module

use Module::Load;
load 'path/to/module.pm';



回答5:


FindBin::libs does the trick:

# search up $FindBin::Bin looking for ./lib directories
# and "use lib" them.

use FindBin::libs;


来源:https://stackoverflow.com/questions/14854861/perl-use-require-abolute-path

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!