En Perl, quelle est la différence entre un fichier .pm (module Perl) et .pl (script Perl)?

88

Quelle est la différence entre les fichiers .pm(module Perl) et .pl(script Perl)?

Veuillez également me dire pourquoi nous revenons 1du dossier. Si return 2 ou autre chose, cela ne génère aucune erreur, alors pourquoi revenons-nous 1du module Perl?

user380979
la source
11
1n'a pas d'importance. Cela peut être 2, cela peut être "foo", cela peut être ["a", "list"]. Ce qui compte, c'est que ce n'est pas le cas 0, ou toute autre chose qui est évaluée comme fausse ou usequi échouerait.
Amadan
.pl est en fait une bibliothèque perl - les scripts perl, comme les programmes C ou les programmes écrits dans d'autres langages, n'ont pas de fin, sauf sur les systèmes d'exploitation qui en ont besoin pour fonctionner, comme Windows.
Rappelez

Réponses:

78

Au fond, l'extension de fichier que vous utilisez ne fait aucune différence quant à l' perlinterprétation de ces fichiers.

Cependant, placer des modules dans des .pmfichiers suivant une certaine structure de répertoires qui suit le nom du package est pratique. Donc, si vous avez un module Example::Plot::FourDet que vous le placez dans un répertoire Example/Plot/FourD.pmdans un chemin dans votre @INC, alors useet requirefera la bonne chose quand on lui donnera le nom du package comme dans use Example::Plot::FourD.

Le fichier doit retourner true comme dernière instruction pour indiquer l'exécution réussie de tout code d'initialisation, il est donc habituel de terminer un tel fichier avec à 1; moins que vous ne soyez sûr qu'il retournera true autrement. Mais il vaut mieux simplement mettre le 1;, au cas où vous ajouteriez plus de déclarations.

Si EXPRest un mot nu, le requireprend une extension ".pm" et remplace "::" par "/" dans le nom de fichier pour vous, pour faciliter le chargement des modules standard. Cette forme de chargement de modules ne risque pas d'altérer votre espace de noms.

Tout ce qu'il usefait est de trouver le nom de fichier à partir du nom du package fourni, requiredans un BEGINbloc et de l'invoquer importsur le package. Rien ne vous empêche de ne pas utiliser usemais de suivre ces étapes manuellement.

Par exemple, ci-dessous, j'ai mis le Example::Plot::FourDpackage dans un fichier appelé t.pl, je l'ai chargé dans un script dans un fichier 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

Cet exemple montre que les fichiers de module n'ont pas à se terminer par 1, toute valeur vraie fera l'affaire.

Sinan Ünür
la source
-2

Un .pl est un script unique.

Dans .pm ( module Perl ), vous avez des fonctions que vous pouvez utiliser à partir d'autres scripts Perl:

Un module Perl est un morceau de code Perl autonome qui peut être utilisé par un programme Perl ou par d'autres modules Perl. Il est conceptuellement similaire à une bibliothèque de liens C ou à une classe C ++.

Igor Oks
la source
5
"Un .pl est un script unique." Pas vrai. Ce n'est que sur les systèmes d'exploitation défectueux que vous devez identifier les programmes Perl avec une extension .pl. Et à l'origine .pl indiquait une "bibliothèque Perl" - des sous-programmes externes que vous avez chargés avec une commande "require" ou "do".
Dave Cross