Comment fonctionne un programme en Perl savoir où trouver le fichier contenant le module Perl-il utilise?
Si mon programme Perl utilise des modules Perl, comment peut-elle savoir où trouver le fichier contenant le code du module?
Par exemple, si le programme contient:
use MyModule1; # Example 1
use This::Here::MyModule2; # Example 2
où il va chercher?
Je ne pouvais pas trouver une réponse exhaustive à cette question pour que je puisse le lien, j'ai donc décidé d'en créer un. Si la réponse fournie ci-dessous est dans le besoin d'ajouts/corrections, veuillez avoir à elle 🙂
OriginalL'auteur DVK | 2010-03-26
Vous devez vous connecter pour publier un commentaire.
Interpréteur Perl (qui exécute votre programme perl) à l'aide d'un tableau appelé
@INC
pour rechercher un fichier contenant le module.Chaque valeur de la
@INC
tableau est un nom de répertoire (mais voir la note ci-dessous); Perl recherche au sein de ces répertoires dans une boucle à l'aide des règles énoncées ci-dessous. (Veuillez vous référer à cette SORTE de post pour les détails de la façon dont le contenu de @INC sont déterminés).Si le module du fichier n'est pas trouvé, après avoir épuisé
@INC
, le programme de la compilation sera annulée avec une erreur. Si le module est un fichier est trouvé dans l'un des répertoires spécifiés dans@INC
, la recherche est terminée sans regarder le reste de@INC
.La façon dont Perl recherches pour un fichier de module à l'intérieur de chacun des répertoires listés dans
@INC
est comme suit:Tout d'abord, il va séparer le nom du module hiérarchique des composants (mots séparés par des
::
), dans le dernier volet - qui sera utilisé pour former un nom de fichier et une hiérarchie chemin (tous les composants précédant le dernier::
).Dans le cas où le nom du module a un seul composant (pas de
::
, par exempleMyModule1
ci-dessus), la hiérarchie chemin est vide et le nom de fichier est le nom du module. Dans le deuxième exemple, dans cette question, la dernière composante estMyModule2
et de la hiérarchie chemin seraThis::Here
.Attendus de nom de fichier sera déterminé par l'ajout de la dernière composante du nom du module avec un
.pm
extension. E. g.MyModule1.pm
etMyModule2.pm
dans nos exemples.REMARQUE: les noms de Module sont évidemment sensibles à la casse sur Unix et autres systèmes d'exploitation où le fichier/répertoire de nommage est sensible à la casse.
Le répertoire du module sera déterminé par:
De prendre la prochaine répertoire de
@INC
- disons/usr/lib/perl
comme un exempleFormant un sous-répertoire de ce répertoire en prenant la hiérarchie chemin d'accès du nom du module (le cas échéant) et le remplacement de "::" avec
/
ou le caractère que le système d'exploitation utilise comme séparateur de répertoire. Dans nos deux exemples, le premier module sera recherchée dans/usr/lib/perl
(pas de sous-répertoire) et le second en/usr/lib/perl/This/Here
.NOTE: ci-dessus une légère simplification -
@INC
peut également contenir des sous-routine références et les références de l'objet, qui charge les modules comme leur code personnalisé spécifie au lieu d'effectuer la recherche dans le répertoire comme indiqué dans le n ° 2 de la logique ci-dessus. Cette fonctionnalité semble très rarement utilisé et cet article suppose que toute la@INC
ne contient que des répertoires.Reprenons un exemple précis, en supposant que votre
@INC
contient deux sous-répertoires:("/usr/lib/perl", "/opt/custom/lib")
.Puis Perl recherche comme suit:
Rappelons que l'interpréteur Perl va ARRÊTER d'essayer de rechercher une fois qu'il trouve le fichier dans l'un des emplacements, sans essayer de voir si le fichier est au plus tard endroits aussi. E. g. si
/usr/lib/perl/This/Here/MyModule2.pm
existe, alors Perl ne cherchera pas, ni se soucient de l'existence, de/opt/custom/lib/This/Here/MyModule2.pm
.NOTE: @INC est utilisée lorsque l'interpréteur Perl est à l'aide de
require
-comme le mécanisme pour l'importation de modules Perl. Cela comprend:require
directive elle-mêmeuse MyModule
déclaration (équivalent à exiger+importation)utilisation de la base
(équivalent à exiger+"push @ISA")-M
paramètre de ligne de commande-I/path/to/dir
options de l'exécutable au moment de l'exécution. (Ces ajouter au tableau)Quelqu'un a une belle liste officielle de précision comment @INC est-elle construite? L'un dans perldoc perlvar semble manquer aucune mention de PERL5LIB, ainsi que la
$Config{sitelib}/sitecustomize.pl
mécanisme (qui doit être construit au moment de la compilation).Excellent! Supposé à tort que vous avez été fait à cause des commentaires à la question et le fait que c'est déjà incroyablement approfondie.
pourriez-vous de marquer cette CW bas, rep les utilisateurs peuvent également modifier leurs réponses?
Fait. Il y va de mon avalanche de rep 🙁 😉
OriginalL'auteur
Bien que cela ne répond pas directement à la question, voici quelques techniques simples pour déterminer le chemin d'accès complet au fichier de module que vous souhaitez utiliser.
Pour afficher le contenu par défaut de la @INC tableau, ainsi que beaucoup d'autres info, à partir de la ligne de commande:
Si vous voulez connaître l'emplacement de la De la carpe module:
À l'intérieur d'un script, l'impression du contenu de la %INC de hachage est utile pour déterminer le module que vous utilisez, en particulier si vous avez modifié @INC de son défaut:
Ce simple script peut également être utilisé pour Trouver l'installation de Perl modules correspondant à une expression régulière et d'identifier les doublons de modules dans des répertoires différents.
fait! stackoverflow.com/questions/2527990/...
Si j'ai deux versions de perl dans ma variable d'environnement path, puis comment le système de savoir qui perl pour ramasser? Est-il le premier? J'ai différents perls pour les différents logiciels installés sur ma machine. Ils ont été installés avec le logiciel.
OriginalL'auteur
Selon la perlfunc documentation sur
utilisation
:Donc
require
ne le levage lourd, et lerequire
de la documentation fournitOriginalL'auteur