Итак, я пытаюсь импортировать модуль в пакет Perl и стараюсь сделать его максимально чистым способом.Сначала я читаю некоторые из предыдущих тем (например: ссылка ).
Модуль находится по следующему пути: /p/disk/tools/perl/5.26.1/lib64/site_perl
.Модуль Data::TreeDumper
.
Я использовал модуль FindBin
для его импорта:
BEGIN {
use Exporter ();
use vars qw(@ISA @EXPORT_OK %EXPORT_TAGS);
use FindBin;
use lib "$FindBin::RealBin";
use lib "$FindBin::Bin";
use lib "$FindBin::Bin/../lib";
use lib "/p/disk/tools/perl/5.26.1/lib64/site_perl";
@ISA = qw(Exporter);
@EXPORT_OK = qw(# ALL subs
);
%EXPORT_TAGS = (all => [@EXPORT_OK]);
}
use constants qw(:all);
use Data::TreeDumper;
Он работает для меня, но путь жестко закодирован.Я хотел бы включить путь в пакет constants
(мой пакет).Но это своего рода круг, потому что для использования констант (и пути) мне нужно сначала импортировать их, а потом откуда?хах.
Поэтому я подумал удалить строку use lib "/p/disk/tools/perl/5.26.1/lib64/site_perl";
и каким-то образом импортировать сначала файл constants
, а затем сделать что-то вроде:
use constants qw(:all);
use lib $PATH_TO_THE_MODULE; # represents path to the module area
use Data::TreeDumper;
Но это не работает.Можно ли этого добиться?
Прежде чем пытаться импортировать модуль (не знал, что он был установлен в глобальном месте), я установил его локально, и он работал.Но я предпочитаю не хранить не мои модули в той же директории, что и проект.Поэтому ИТ-специалисты установили модуль в глобальной области, и я просто спросил, можно ли импортировать его чистым способом.
РЕДАКТИРОВАТЬ: Я пытаюсь вставить путь /p/disk/tools/perl/5.26.1/lib64/site_perl
в файл констант в глобальной переменной (назовем это $PATH_TO_THE_MODULE
).Затем я хочу импортировать из другого пакета пакет constants
, поэтому я использую FindBin
.И затем я хочу импортировать модуль, используя переменную $PATH_TO_THE_MODULE
, которая указывает на область модуля.Так это должно выглядеть примерно так:
use constants qw(:all);
use lib $PATH_TO_THE_MODULE; # represents a path to the module area
use Data::TreeDumper;
Но это не работает.Я попытался переключиться на require
, потому что понял, что require
будет использоваться динамически.Но он также не работает с Can't locate Data/TreeDumper.pm in @INC
.
Так что, если мы соединяем оба фрагмента кода, мы получаем:
package test;
$|=1;
use strict;
use warnings;
BEGIN {
use Exporter ();
use vars qw(@ISA @EXPORT_OK %EXPORT_TAGS);
use FindBin;
use lib "$FindBin::RealBin";
use lib "$FindBin::Bin";
use lib "$FindBin::Bin/../lib";
@ISA = qw(Exporter);
@EXPORT_OK = qw(# ALL subs
);
%EXPORT_TAGS = (all => [@EXPORT_OK]);
}
use constants qw(:all);
use lib $PATH_TO_THE_MODULE; # represents a path to the module area
use Data::TreeDumper;
print "Hi\n";
пакет констант:
package constants;
$|=1;
use strict;
use warnings;
BEGIN {
use Exporter ();
use vars qw(@ISA @EXPORT_OK %EXPORT_TAGS);
use FindBin;
use lib "$FindBin::RealBin";
use lib "$FindBin::Bin";
use lib "$FindBin::Bin/../lib";
@ISA = qw(Exporter);
@EXPORT_OK = qw($PATH_TO_THE_MODULE);
%EXPORT_TAGS = (all => [@EXPORT_OK]);
}
our $PATH_TO_THE_MODULE = "/p/disk/tools/perl/5.26.1/lib64/site_perl";
Если я 'Я удалю use lib $PATH_TO_THE_MODULE;
и use Data::TreeDumper;
из пакета test
, и я напечатаю $PATH_TO_THE_MODULE
, он скомпилирует и напечатает путь, как и ожидалось.