В Perl, в чем разница между файлом .pm(Perl module) и .pl(Perl script)?

В чем разница между .pm (Perl-модулем) и .pl (Perl script) файлом?

Пожалуйста, также скажите мне, почему мы возвращаем 1 из файла. Если return 2 или что-то еще, это не порождает никаких ошибок, так почему мы возвращаем 1 из модуля Perl?

Ответ 1

В самом ядре расширение файла, которое вы используете, не имеет значения, как 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, загружал его в файл script в файле 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, любое истинное значение будет делать.

Ответ 2

A.pl - это единственный script.

В .pm(Perl Module) у вас есть функции, которые вы можете использовать из других скриптов Perl:

Модуль Perl - это самодостаточная часть кода Perl, которая может использоваться программой Perl или другими модулями Perl. Он концептуально похож на библиотеку C-ссылок или на класс С++.