Обязательно ли для создания пакета должна присутствовать папка с именем пакета? - PullRequest
4 голосов
/ 22 января 2009

Мы выделяем общий код из нашего проекта Perl. Одна основная программа должна быть разбита на несколько повторно используемых модулей.

Наше имя программы validate_results.pl, которое содержит набор команд проверки. Мы планируем разделить это на маленькие модули, чтобы validate_results.pl было похоже на:

use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...

В соответствии с моим пониманием, я должен создать общую папку, и под этим Validate_Results.pm должен присутствовать. Снова под Common, должна быть создана папка Validate_Results, и под ней должны присутствовать папки CommonCommands и ReturnCodeValidation.

Обязательно ли, чтобы все эти папки присутствовали, или мы можем собрать все программы Perl в одну папку, логически сгруппировать их и все же использовать вышеуказанный способ для доступа к модулям (скажем, использовать common::validate_results вот так)

Ответы [ 4 ]

6 голосов
/ 22 января 2009

Требуется иерархия файловой системы. A :: B :: C всегда будет находиться в A / B / C.pm, где-то в @ INC.

Если у вас есть , чтобы обойти это, прочитайте perldoc -f require , в частности, ищите раздел о ссылках на подпрограммы в @INC. Да, вы можете заставить загрузчик модулей делать странные вещи, если вы действительно этого хотите; но это не то, что вы хотите, поверьте мне. Просто придерживайтесь соглашения, как и другие 99,999999% приложений Perl.

3 голосов
/ 22 января 2009

Если вы хотите «использовать» ваши модули, то вы должны соответствовать структуре. Если вы хотите обойти это, вы можете вместо этого «требовать» свои модули, передавая имя файла для запроса.

Вы действительно не должны этого делать, хотя. Если вы действительно не хотите иметь структуру каталогов, уберите ее из имен модулей (хотя это может привести к проблемам в будущем, если у вас когда-либо появится имя модуля, которое конфликтует с чем-то более общим из CPAN). Просто добавьте каталог scripts в путь INC через Find :: Bin и используйте модули напрямую:

use FindBin;
use lib $FindBin::Bin;

use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;

НТН

2 голосов
/ 22 января 2009

Вот пример модуля и его подмодулей в одном файле:

package Foo;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo' );

sub from_foo { print "from_foo\n"; }

package Foo::Bar;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo_bar' );

sub from_foo_bar { print "from_foo_bar\n"; }

1;

В вашей программе, если вы используете модуль Foo (тот, что с файлом .pm):

use Foo;

У вас будет доступ к функциям Foo :: Bar , кроме как в качестве канонических имен (Foo :: Bar :: from_foo_bar). Вы можете импортировать их так:

use Foo;
Foo::Bar->import;

Обратите внимание, что вы не можете сделать это:

use Foo::Bar;

Потому что нет файла Foo / Bar.pm .

0 голосов
/ 27 января 2009

Имя пакета в команде 'use' - это просто путь, который заканчивается файлом .pm, поэтому вам не нужна папка с именем каждого пакета. В вашем примере вам нужны папки:

Common
Common/Validate_Results

Но вам не нужны папки:

Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation

Фактическое имя пакета в файле .pm не обязательно должно совпадать с именем в команде use, которая его загружает. Но держать пути в соответствии с именами пакетов - это всегда хорошая идея.

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