Как я использую модуль Perl от относительного местоположения?

Пожалуйста, используйте пост-запрос AJAX для удаления по коду.

37
задан Kevin Panko 21 April 2017 в 17:25
поделиться

5 ответов

Стандартный модуль FindBin делает то, что вы хотите.

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

perldoc FindBin для получения дополнительной информации.

49
ответ дан 27 November 2019 в 04:48
поделиться

Разобрать полный путь к вашему .pl через __ FILE __ и, затем, прикрепите ../ lib в конце или вытолкните последний элемент из split ( / \ //, __ FILE __) и добавьте к этому / lib .

5
ответ дан 27 November 2019 в 04:48
поделиться

I generally use this technique. Its sadly inspired from my PHP days:

Its handy in situations where you know where a given file will be relative to the current one, and aren't sure of the entry points it may be called in or the surrounding environment at calltime.

However, I would generally use this technique only for test scripts which need dummy libraries for emulating things.

use File::Basename ();
use Cwd            ();
my $base_dir;
my $relative_path; 
BEGIN {
    $realitive_path = '../../' # Path to base of project relative to the current file
    $base_dir = Cwd::realpath( File::Basename::dirname(__FILE__) .'/' . $relative_path );
}


use lib "${base_dir}/lib";
use Foo;

Ideally there should be some module somewhere that does this, if not, I'm half tempted to write one:

use Some::Module ();
use lib Some::Module::relative_self('../../lib', __FILE__ ); 
3
ответ дан 27 November 2019 в 04:48
поделиться

Модуль «FindBin» будет работать только в том случае, если каталог, в котором находится скрипт perl, находится в вашей системной переменной PATH, в противном случае произойдет сбой. Чтобы преодолеть это , вы можете манипулировать значением $ 0 , чтобы получить информацию о вашем пути к модулю perl и передать значение в , используя lib .

Что-то вроде этого -

BEGIN {
    use File::Spec::Functions qw(rel2abs);
    use File::Basename qw(dirname);

    #Covert the script path to absolute and get its directory name
    our $path = dirname( rel2abs($0) );

    #Replace the bin tag with lib to get module directory
    $path =~ s{bin/?$}{lib};
}

use lib $path;

EDIT: Модуль FindBin работает просто отлично и может использоваться, как описано в Ответ Михаэля . Мое понимание его работы было неполным и поэтому заставило меня сделать первый комментарий, от которого я сейчас отказываюсь. В любом случае, я не вижу причин, почему этот метод не должен работать, хотя с несколькими строками больше, чем можно было бы достичь с помощью FindBin (TMTOWTDI).

3
ответ дан 27 November 2019 в 04:48
поделиться

Как насчет:

BEGIN: {
    push @INC, '/full/path/to/lib';
}

Для создания относительной ссылки предполагается, что вы сохраните ее в каталоге bin, поэтому вместо нее вставьте относительную ссылку.

-3
ответ дан 27 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: