Я обычно создаю свой собственный префикс модуля - названный в честь проекта или места, где я работал. Например, вы можете поместить все в 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
.
(Если вы считаете, что это сложно, я рад, что я не сказал вам, что вам действительно следует использовать объектно-ориентированные методы в ваших модулях. Это действительно лучший способ сделать это.)