开发者

How can I tell perl the path for a module?

I use a perl module file in my perl script:

printtab.pl

use Table;

Table.pm is present in the same directory as printtab.pl, so as long as I am executing printtab from the directory, it executes fine.

But If I execute it from some other place, for example, using a cronjob, I get an error mentioning that the module is not found in @INC.

What is the correct way to resolve this?

I tried

push 开发者_开发百科@INC, "/path/Table.pm";

but it does not work. Can you tell me why?

I found about use lib and it works correctly

use lib "/path";

Is use lib the best method in such a situation?


use lib is a good option. But is you place your modules in the same directory as your programs (or in a sub-directory relative to the one containing your programs), you could use use FindBin; like:

use FindBin;
use lib "$FindBin::Bin/../lib";


push @INC, "/path/Table.pm";

Does not work because @INC is supposed to be a list of directories, not of full paths to modules. So if you do:

push @INC, "/path";

It should work.

Having said that, use lib "/path"; is also a good option.

Depending on your programs' install directory structure using the FindBin to determine the real location of your script may prove useful to construct the correct path to your module.


A neat little trick:

#! /usr/bin/env perl

use strict;
use warnings;

BEGIN {
    our $moduleIsMissing;
    eval {
        require My::Module;
    };

    if ($@) {
        $moduleIsMissing = 1;
    }
}

if ($main::moduleIsMissing) {
    print "Module is missing. I've got to do something about it!\n"
}
else {
    print "Module is there. I'm fine!\n";
}

I'm not happy about the $main::moduleIsMissing thing, but I haven't figured a way around it.

If My::Module is available, it's loaded and everything is fine. Otherwise, the $main::moduleIsMissing flag is set. This allows you to test to see if the module was loaded, and if not, take evasive action. For example, your program will use boldfacing when printing text if module Term::Cap is available, but if not, will simply print out the text sans the boldface.


Back to the question: It's much better to do:

use lib "MyDir";

Rather than the @INC.

The use lib includes the directory at compile time. Thus, if I had a module "Foo::Bar" in directory "MyDir", I could do this:

use lib qw(MyDir);
use Foo::Bar;

without Perl complaining. If I did this:

push (@INC, qw(MyDir));
use Foo::Bar;;

Perl would complain it can't find my module.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜