Я обычно использую эту технику. Его печально вдохновили мои дни PHP:
Это удобно в ситуациях, когда вы знаете, где данный файл будет относительно текущего, и не уверены в точках входа, в которые он может быть вызван, или в окружающую среду во время вызова.
Однако я бы обычно использовал эту технику только для тестовых сценариев, которым для эмуляции нужны фиктивные библиотеки.
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;
В идеале где-то должен быть какой-то модуль, который делает это, если нет, то я наполовину соблазн написать один:
use Some::Module ();
use lib Some::Module::relative_self('../../lib', __FILE__ );