Включая файлы в личку модуль - PullRequest
0 голосов
/ 24 июня 2011

Я совершенно новичок в Perl / Fastcgi.

У меня есть несколько PM-модулей, к которым нужно будет добавить много скриптов, и со временем оно будет расти и расти. Следовательно, мне нужна структура, которая облегчит работу администратора.

Итак, я хочу создать файлы в какой-то структуре каталогов, которую я могу включить. Я хочу, чтобы файлы, которые я включаю, были точно такими же, как если бы текст был записан в файл, в который я включаю.

Я пробовал «делать», «использовать» и «требовать». Фактический файл, который я хочу включить, находится в одном из каталогов, которые ищет Perl. (Проверено с помощью perl -V)

Я пытался внутри и снаружи НАЧАЛО {}.

Как мне это сделать? Возможно ли это вообще, включая файлы pm в файлах pm? Это должны быть PM-файлы, которые я включаю, или это может быть любое расширение?

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

Config.pm

package Kernel::Config;

sub Load {

#other activities

require 'severalnines.pm';

#other activities

}
1;

severalnines.pm

# Filter Queues

$Self->{TicketAcl}->{'ACL-hide-queues'} = {
                Properties => {
},
                PossibleNot => {Ticket => { Queue =>
                    ['[RegExp]^*'] },

  },
};
1;

Я не получаю никаких ошибок в Apache error_log, связанных с этим. Тем не менее, код не распознается, как если бы я поместил его в файл Config.pm.

Я не собираюсь много программировать, просто займусь администратором в стороннем приложении. Тем не менее, я искал, пытаясь узнать, как это работает с включением файлов. Считается ли, что twonines.pm является модулем perl, и нужно ли мне использовать такую ​​программу, как h2xs или аналогичную, чтобы «создать» модуль (сказал вам, совсем новичок ...)?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 25 июня 2011

Я обычно создаю свой собственный префикс модуля - названный в честь проекта или места, где я работал. Например, вы можете поместить все в Mu с модулями, такими как Mu::Foo и Mu::Bar. Используйте несколько модулей (не пытайтесь хранить все в одном файле) и присвойте им имена с суффиксом *.pm.

Тогда, если каталог Mu находится в том же каталоге, что и ваши программы, вам нужно только сделать это:

use Mu::Foo;
use Mu::Bar;

Если они находятся в другом каталоге, вы можете сделать это:

use lib qw(/path/to/other/directory);
use Mu::Foo;
use Mu::Bar;

Возможно ли это вообще, включая файлы pm в файлах pm?

Почему, конечно, да.

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

Это плохая, плохая идея. Вам лучше использовать механизм упаковки. То есть объявите каждый ваш модуль как отдельное имя пакета. В противном случае в вашем модуле будет переменная или функция, которую ваш скрипт будет переопределять, и вы никогда не узнаете это.

В Perl вы можете ссылаться на переменные в ваших модулях, добавляя к имени модуля префикс. (Например, File :: Find делает. Например, $File::Find::Name - имя найденного файла. Это не загрязняет ваше пространство имен.

Если вы действительно хотите, чтобы функции и переменные вашего модуля были в вашем пространстве имен, посмотрите переменную списка @ EXPORT_OK в Exporter . Это список всех переменных и функций, которые вы хотите импортировать в пространство имен вашего модуля. Тем не менее, это не автоматически, вы должны перечислить их рядом с вашим use заявлением. Таким образом, вы с большей вероятностью узнаете о них. Использование Exporter не так уж сложно. В вашем модуле вы бы поместили:

package Mu::Foo;
use Exporter qw(import);
our EXPORT_OK = qw(convert $fundge @ribitz);

Затем в вашей программе вы добавите:

use Mu::Foo qw(convert $fundge @ribitz);

Теперь вы можете получить доступ к convert, $fundge и @ribitz, как если бы они были частью вашей основной программы. Однако теперь вы задокументировали, что вы извлекаете эти подпрограммы и переменные из Mu::Foo.

(Если вы считаете, что это сложно, я рад, что я не сказал вам, что вам действительно следует использовать объектно-ориентированные методы в ваших модулях. Это действительно лучший способ сделать это.)

0 голосов
/ 25 июня 2011
if (    'I want the files that I include will be exactly like if the text were written in the file where I do the include.' 
     && 'have to add a lot of scripts and over time it will grow and grow') {
    warn 'This is probably a bad idea because you are not creating any kind of abstraction!';
}

Взгляните на Экспортер , это, вероятно, даст вам хорошее решение!

...