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

88

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

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

user380979
источник
11
1не важно. Может быть 2, может быть "foo", может быть ["a", "list"]. Важно то, что это не так 0, или что-то еще, что оценивается как ложное или не useсработает.
Амадан,
.pl на самом деле является библиотекой Perl - сценарии Perl, как программы C или программы, написанные на других языках, не имеют окончания, за исключением операционных систем, которым он нужен для работы, таких как Windows.
Помните Монику

Ответы:

78

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

Синан Унюр
источник
-2

.Pl - это единый скрипт.

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

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

Игорь Окс
источник
5
«A .pl - это единый скрипт». Не правда. Идентифицировать программы Perl с расширением .pl нужно только в неработающих операционных системах. И изначально .pl обозначал «библиотеку Perl» - внешние подпрограммы, которые вы загружали с помощью команды «require» или «do».
Дэйв Кросс