Perl: как разделить импорт большого списка модулей между многими независимыми скриптами? - PullRequest
7 голосов
/ 07 февраля 2011

У меня много автономных скриптов. Единственное, что они разделяют, это то, что они используют () большой набор модулей CPAN (каждый из которых экспортирует несколько функций). Я хотел бы централизовать этот список модулей. Я нашел несколько методов. Какой из них лучший?

  1. Я мог бы создать SharedModules.pm, который импортирует все, а затем вручную экспортирует все в main :: using Exporter.

  2. Я мог бы создать SharedModules.pm, который начинается с "package main;" поэтому он будет импортирован непосредственно в main ::. Вроде работает. Это плохая практика и почему?

  3. Я мог бы потребовать () sharedmodules.pl, который, кажется, импортирует все в main ::. Мне не нравится этот метод, так как require () не очень хорошо работает под mod_perl.

Номер два выглядит лучше всего для меня, однако мне интересно, почему, например, Modern :: Perl не работает таким образом.

Редактировать: Я полагал, что этот вопрос задавали раньше .

Ответы [ 5 ]

6 голосов
/ 07 февраля 2011

Может быть, более гибким, чем поместить все в пространство имен main, будет импорт в пространство имен вызывающего.Как то так:

package SharedModules;

sub import {

    my $pkg = (caller())[0];
    eval <<"EOD";

package $pkg;

use List::Util;
use List::MoreUtils;

EOD

    die $@ if $@;
}

1;
4 голосов
/ 07 февраля 2011

Проблема всех трех предложенных вами решений заключается в том, что модуль может быть use d от другого модуля, и в этом случае символы следует экспортировать в пакет модуля use ing, а не в main. *Решение 1004 *

bvr по использованию caller для импорта товаров непосредственно в этот пакет является важным шагом в правильном направлении, но не позволяет «реальному» пакету использовать use ShareableModules qw( foo bar baz); для выборочного импорта только того, что ему действительно нужно.

К сожалению, для сохранения возможности выборочного импорта потребуется импортировать все соответствующие символы из базовых модулей, а затем реэкспортировать их из ShareableModules.Вы не можете просто делегировать импорт каждому базовому модулю import (как это делает Modern::Perl), потому что import умирает, если его просят о символе, который не экспортируется этим модулем.Если это не проблема, то способ Modern::Perl, вероятно, самый чистый и простой.

2 голосов
/ 08 февраля 2011

Может быть, вы хотите Инструментарий .

2 голосов
/ 07 февраля 2011

Использование require - самый естественный способ сделать это.В mod_perl может потребоваться изменить @INC во время запуска сервера.

1 голос
/ 07 февраля 2011

Файл import.pl:

require blah;  blah->import;
require blubb; blubb->import;

Skripts:

#!/usr/bin/perl
do 'import.pl'
...

Patrick

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