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


88

Яка різниця між файлом .pm(модуль Perl) та .pl(сценарій Perl)?

Також скажіть, чому ми повертаємось 1із файлу. Якщо повертає 2 або щось інше, це не генерує жодної помилки, то чому ми повертаємось 1із модуля Perl?


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
".Pl - це єдиний сценарій." Неправда. Тільки у непрацездатних операційних системах потрібно ідентифікувати програми Perl із розширенням .pl. І спочатку .pl вказував "бібліотеку Perl" - зовнішні підпрограми, які ви завантажили командою "вимагати" або "робити".
Дейв Крос,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.