Использование FindBin в более чем одном модуле - PullRequest
5 голосов
/ 07 октября 2011

Вот сценарий, у меня есть два файла: 1. dir / A.pm 2. dir / new_dir / at

Вот так выглядит A.pm:

package A;
use FindBin;
use Test::More;
is (FindBin->again, 'dir', 'got dir');
1;                    

Вот как выглядит:

use FindBin;
use Test::More qw(no_plan); 
use A;
is (FindBin->again, 'dir/new_dir', 'got dir/new_dir');

Итак, я запустил файл с perl new_dir / at и ожидаю, что мои тесты пройдут.Но это мой результат теста:

not ok 1 - got dir
#   Failed test 'got fir'
#   at A.pm line 6.
#          got: 'dir/new_dir'
#     expected: 'dir'
ok 2 - got dir/new_dir
1..2

Я что-то не так делаю?Я очень новичок в Perl.Пожалуйста, помогите !!

Ответы [ 3 ]

7 голосов
/ 07 октября 2011

Как отмечает Дейв Шерохман , FindBin предназначен для поиска местоположения основного скрипта, а не отдельных модулей.Из документации:

NAME
       FindBin - Locate directory of original perl script

(по общему признанию, документация, несколько запутанно, ссылается на «модули» в разделе «ИЗВЕСТНЫЕ ПРОБЛЕМЫ»), но на самом деле это не означает, что вы подразумеваете под этим.)

В любом случае, если вы посмотрите на источник с perldoc -m FindBin, вы увидите, что FindBin получает путь к сценарию из переменной $0.Если вы заинтересованы в поиске местоположения модуля, включенного через use (или require), вам следует поискать под %INC, что-то вроде этого:

package Foo::Bar;
use File::Spec;
my ($vol, $dir, $file) = File::Spec->splitpath( $INC{'Foo/Bar.pm'} );
5 голосов
/ 07 октября 2011

FindBin находит расположение запущенного Perl файла, а не файла, выполняемого в данный момент.

Не понимаю, зачем вам нужен путь к модулю & mdash; File :: ShareDir может использоваться для доступа к файлам данных вашего модуля & mdash; но следующий найдет его:

use Cwd            qw( realpath );
use File::Basename qw( dirname );

my $module_dir = dirname(realpath(__FILE__));

Применяется то же предостережение, что и Find :: Bin: Это работает, только если chdir не было изменено.

3 голосов
/ 07 октября 2011

Если я правильно понял вопрос, a.t находится в каталоге dir/new_dir/, и вы используете new_dir/a.t для его запуска из dir/, верно?

Если так, значит, он поступает правильно. Поскольку a.t находится в dir/new_dir, вы всегда должны получать dir/new_dir из FindBin - его работа заключается в Найти Bin ary (программа), а не в том, чтобы найти файл, который вызывается из, поэтому результат будет A.pm таким же, как и в a.t.

Функция ->again предназначена для запуска экземпляров совершенно разных программ из одного и того же интерпретатора perl, например, что делает mod_perl, а не просто для использования разных модулей в одной программе.

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