По сути, используемое расширение файла не имеет значения, как perl
интерпретирует эти файлы.
Однако, размещение модулей в файлах .pm
следует определенной структуре каталогов, которая следует за пакетомНазвание обеспечивает удобство.Итак, если у вас есть модуль Example::Plot::FourD
и вы поместите его в каталог Example/Plot/FourD.pm
по пути в вашем @INC
, тогда use
и require
будет делать правильные вещи, когда ему присваивается имя пакета, как в use Example::Plot::FourD
.
Файл должен возвращать true в качестве последнего оператора, чтобы указать успешное выполнение любого кода инициализации, поэтомуобычно заканчивать такой файл 1;
, если вы не уверены, что в противном случае он вернет true.Но лучше просто поставить 1;
, если вы добавите больше операторов.
Если EXPR
- пустое слово, require
предполагает расширение ".pm" и заменяет "::" на«/» в имени файла, чтобы упростить загрузку стандартных модулей.Эта форма загрузки модулей не рискует изменить ваше пространство имен.
Все, что use
делает, это выясняет имя файла из предоставленного имени пакета, require
оно в блоке BEGIN
ивызвать import
на упаковке.Ничто не мешает вам не использовать use
, а выполнять эти шаги вручную.
Например, ниже я помещаю пакет Example::Plot::FourD
в файл с именем t.pl
, загружаю его в сценарий в файл s.pl
.
C:\Temp> cat t.pl
package Example::Plot::FourD;
use strict; use warnings;
sub new { bless {} => shift }
sub something { print "something\n" }
"Example::Plot::FourD"
C:\Temp> cat s.pl
#!/usr/bin/perl
use strict; use warnings;
BEGIN {
require 't.pl';
}
my $p = Example::Plot::FourD->new;
$p->something;
C:\Temp> s
something
В этом примере показано, что файлы модулей не должны заканчиваться на 1
, подойдет любое истинное значение.