В чем разница между .pm
(модулем Perl) и .pl
файлом (скриптом Perl)?
Скажите, пожалуйста, почему мы возвращаемся 1
из файла. Если возвращается 2 или что-то еще, это не вызывает ошибок, так почему же мы возвращаемся 1
из модуля Perl?
В чем разница между .pm
(модулем Perl) и .pl
файлом (скриптом Perl)?
Скажите, пожалуйста, почему мы возвращаемся 1
из файла. Если возвращается 2 или что-то еще, это не вызывает ошибок, так почему же мы возвращаемся 1
из модуля Perl?
Ответы:
По сути, расширение файла, которое вы используете, не имеет значения, как 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
, подойдет любое истинное значение.
.Pl - это единый скрипт.
В .pm ( модуль Perl ) у вас есть функции, которые вы можете использовать из других скриптов Perl:
Модуль Perl - это автономный фрагмент кода Perl, который может использоваться программой Perl или другими модулями Perl. Концептуально он похож на библиотеку ссылок C или класс C ++.
1
не важно. Может быть2
, может быть"foo"
, может быть["a", "list"]
. Важно то, что это не так0
, или что-то еще, что оценивается как ложное или неuse
сработает.