700 Software
700 Software

Reputation: 87763

use/require absolute path?

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.

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.

Upvotes: 8

Views: 29131

Answers (5)

Gilles Quénot
Gilles Quénot

Reputation: 185025

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, don't be afraid, that's what use lib does too) :

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

Upvotes: 8

user966588
user966588

Reputation:

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.

Upvotes: 3

ikegami
ikegami

Reputation: 385655

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

Upvotes: 1

creaktive
creaktive

Reputation: 5210

FindBin::libs does the trick:

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

use FindBin::libs;

Upvotes: -1

user2050283
user2050283

Reputation: 570

You can use the Module::Load module

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

Upvotes: -1

Related Questions