Как я могу сказать Perl путь для модуля? - PullRequest
4 голосов
/ 05 июня 2011

Я использую файл модуля perl в моем скрипте perl:

printtab.pl

use Table;

Table.pm присутствует в том же каталоге, что и printtab.pl, поэтому, пока я выполняю printtab из каталога, он работает нормально.

Но если я выполню его из другого места, например, с помощью cronjob, я получу сообщение об ошибке, в котором говорится, что модуль не найден в @INC.

Как правильно решить эту проблему?

Я пытался

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

но это не работает. Можете ли вы сказать мне, почему?

Я нашел около use lib, и он работает правильно

use lib "/path";

Является ли использование lib лучшим методом в такой ситуации?

Ответы [ 3 ]

14 голосов
/ 05 июня 2011

use lib хороший вариант. Но если вы разместите свои модули в том же каталоге, что и ваши программы (или в подкаталоге относительно каталога, содержащего ваши программы), вы можете использовать use FindBin;, например:

use FindBin;
use lib "$FindBin::Bin/../lib";
4 голосов
/ 06 июня 2011
push @INC, "/path/Table.pm";

Не работает, потому что @INC должен быть списком каталогов, а не полными путями к модулям.Поэтому, если вы сделаете:

push @INC, "/path";

Это должно работать.

Сказав это, use lib "/path"; также является хорошим вариантом.

В зависимости от каталога установки ваших программструктура, использующая FindBin для определения реального местоположения вашего скрипта, может оказаться полезной для построения правильного пути к вашему модулю.

1 голос
/ 06 июня 2011

Аккуратный трюк:

#! /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";
}

Я не доволен вещью $main::moduleIsMissing, но я не нашел способ обойти это.

Если доступно My::Module, оно загружено и все в порядке. В противном случае устанавливается флаг $main::moduleIsMissing. Это позволяет вам проверить, был ли загружен модуль, и, если нет, предпринять уклончивое действие. Например, ваша программа будет использовать полужирный шрифт при печати текста, если модуль Term::Cap доступен, но если нет, просто распечатает текст без полужирного шрифта.


Вернуться к вопросу: гораздо лучше сделать:

use lib "MyDir";

Вместо @INC.

use lib включает каталог во время компиляции. Таким образом, если бы у меня был модуль «Foo :: Bar» в каталоге «MyDir», я мог бы сделать это:

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

без жалоб на Perl. Если бы я сделал это:

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

Perl пожалуется, что не может найти мой модуль.

...