Каков порядок поиска в пути включения Perl при загрузке модуля? - PullRequest
2 голосов
/ 02 декабря 2011

Допустим, в @INC есть три пути: path1, path2 и path3. Под каждым из этих путей есть модуль с именем foo.pm. Если я сейчас загружу foo.pm в свой скрипт через use foo;, то какой из foo.pm будет загружен? Или, другими словами, каков порядок поиска путей в Perl в @INC?

Ответы [ 2 ]

7 голосов
/ 02 декабря 2011

perldoc -v% INC показывает, какой путь был выбран:

use Data::Dumper; 
print Dumper(\%INC);

Или ...

perl -Mfoo -e 'print $INC{"foo.pm"}'

require показывает некоторый псевдо-код, который подразумевает порядок поиска:

foreach $prefix (@INC) {
}

Таким образом, path1 будет найден первым.

6 голосов
/ 02 декабря 2011

путь1, путь2, путь3. И Perl загрузит path1/foo.pm.

Почему вы ожидаете, что это будет что-то другое?

Глядя на perlfunc perlvar, я вижу, что они явно не говорят этого, но они говорят:

Массив @INC содержит список мест, в которых конструкции do EXPR, требуют или используют конструкции для поиска своих библиотечных файлов.

Я думаю, что подсказка есть список . Нет ничего необычного в том, что список будет обрабатываться первым до последнего.

Возможно, вы могли бы поместить этот код прямо перед вашим use foo; оператором:

BEGIN { say "\@INC=(${\join( ', ', @INC )})"; }

Если это все еще показывает вам @INC=(/path1, /path2, /path3), поместите это после оператора use:

BEGIN { say "\$INC{'foo.pm'}=$INC{'foo.pm'}"; }

И если тот все еще показывает $INC{'foo.pm'}=/path3/foo.pm, то я думаю, что вы не указываете свои пути поиска так, как могли бы. Вы можете подумать, что у вас есть foo.pm в том же каталоге, который указан как '/ path1', но вероятность состоит в том, что вы запутались в некотором пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...