web-dev-qa-db-fra.com

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

Quelle est la différence entre .pm (Module Perl) et .pl Fichier (script Perl)?

Dites-moi aussi pourquoi nous revenons 1 du fichier. Si return 2 ou quoi que ce soit d'autre, cela ne génère aucune erreur, alors pourquoi retournons-nous 1 du module Perl?

83
user380979

Au fond, l'extension de fichier que vous utilisez ne fait aucune différence quant à la façon dont Perl interprète ces fichiers.

Cependant, mettre des modules dans .pm Les fichiers suivant une certaine structure de répertoires qui suit le nom du paquet sont pratiques. Donc, si vous avez un module Example::Plot::FourD et vous le mettez dans un répertoire Example/Plot/FourD.pm dans un chemin dans votre @INC , alors use et require fera le bon choix si le nom du paquet est donné comme dans use Example::Plot::FourD.

Le fichier doit renvoyer true comme dernière instruction pour indiquer que l'exécution de tout code d'initialisation a réussi. Il est donc habituel de terminer un tel fichier avec 1; _ sauf si vous êtes sûr que cela retournera vrai sinon. Mais il vaut mieux mettre le 1;, au cas où vous ajouteriez d'autres déclarations.

Si EXPR est un mot nu, le require suppose une extension ".pm" et remplace "::" par "/" dans le nom du fichier pour vous faciliter le chargement des modules standard. Cette forme de chargement de modules ne risque pas de modifier votre espace de noms.

Tout ce que use fait, c'est trouver le nom du fichier à partir du nom du paquet fourni, require dans un bloc BEGIN et invoquer import sur le paquet. Rien ne vous empêche de ne pas utiliser use mais de suivre ces étapes manuellement.

Par exemple, ci-dessous, je mets le Example::Plot::FourD package dans un fichier nommé t.pl, le charge dans un script du 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 ne doivent pas nécessairement se terminer par 1, toute vraie valeur fera l'affaire.

74
Sinan Ünür