En Perl, il est préférable d'utiliser un module que de besoin d'un fichier?
Une autre question m'a fait réfléchir sur les différentes méthodes de réutilisation de code: use
vs require
vs do
Je vois beaucoup de posts ici, où la question tourne autour de l'utilisation de require
de charger et d'exécuter du code. Cela me semble être une évidente mauvaise pratique, mais je n'ai pas trouvé de bonnes ressources sur, la question que je peut pour.
perlfaq8 couvre la différence entre use
et require
, mais il n'offre pas de conseils à l'égard de préférence, comme de 5.10-dans 5.8.8 il est un peu rapide de conseils en faveur de l'utilisation).
Ce sujet semble souffrir d'un manque de discussion. J'ai quelques questions que j'aimerais voir abordés:
- Quelle est la méthode préférée de la réutilisation de code en Perl?
use ModuleName;
require ModuleName;
require 'file.pl';
do 'file.pl';
- Quelle est la différence entre
require ModuleName
etrequire "file.pl"
? - Est jamais une bonne idée d'utiliser
require "file.pl"
? Pourquoi ou pourquoi pas?
- Vouliez-vous dire
require Module
ou peut-êtredo "file"
au lieu derequire "file"
? require "file"
utilisedo "file"
pour traiter ses arugment, mais il ne fonctionne que sur un fichier en même temps.- Ce n'est pas ce que j'étais en demandant au sujet. Généralement
do
est utilisé pour *.pl des fichiers tout enrequire
est utilisé pour *.pm fichiers. L'extension du fichier n'a pas d'importance, bien sûr, mais par convention *.pl n'a pas signifié "bibliothèque perl" pour un long moment. J'ai essayé de préciser si vous faisiez référence à l'ancien usage, ou si la question devrait être modifié pour refléter les trois façons de chargement de code externe (use
,require
, etdo
). Il serait plus logique (pour moi) pour inclure tous les trois formes dans la discussion. - oui, je veux dire l'ancien style d'utilisation. Pour quelque raison que ce soit, je vois plus de gens à l'aide de
require
sur que je vois à l'aide dedo
. Il est logique d'inclure l'utilisation dedo
dans la question. Si vous avez une bonne idée sur la formulation, veuillez modifier la question. Le but est d'obtenir une bonne ressource pour les gens au, au lieu de réécrire la même réponse ("utilisation des modules à la place") et plus.
Vous devez vous connecter pour publier un commentaire.
Pratique Standard consiste à utiliser
use
la plupart du temps,require
temps en temps, etdo
rarement.do 'file'
exécuterafile
comme un script Perl. C'est presque comme si l'appel deeval
sur le contenu du fichier; si vousdo
plusieurs fois le même fichier (par exemple, dans une boucle), il sera analysé et évalué chaque fois ce qui est peu probable d'être ce que vous voulez. La différence entredo
eteval
est quedo
ne pouvez pas voir les variables lexicales dans le cadre englobant, qui le rend plus sûr.do
est parfois utile pour des tâches simples comme le traitement d'un fichier de configuration qui est écrit dans la forme de code Perl.require 'file'
est commedo 'file'
sauf qu'elle ne fait qu'analyser n'importe quel fichier particulier à un moment et va lever une exception si quelque chose va mal. (par exemple, le fichier ne peut être trouvé, il contient une erreur de syntaxe, etc.) La vérification automatique des erreurs en fait un bon remplacement pourdo 'file'
mais il est encore seulement adapté pour les mêmes gestes simples.La
do 'file'
etrequire 'file'
formes sont des reports de jours passé lorsque l' *.pl extension de fichier signifie "Bibliothèque Perl." La façon moderne de la réutilisation de code en Perl est de les organiser dans des modules. L'appel de quelque chose d'un "module" au lieu de "bibliothèque" est juste de la sémantique, mais le sens des mots distinctement des choses différentes en Perl culture. Une bibliothèque est juste une collection de routines; un module dispose d'un espace de noms, ce qui rend beaucoup plus approprié pour les réutiliser.use Module
est la façon normale de l'aide de code à partir d'un module. Notez queModule
est le nom du package de mot nu et pas une chaîne contenant un nom de fichier. Perl gère la traduction à partir d'un nom de package à un nom de fichier pour vous.use
états se produire au moment de la compilation et de lever une exception en cas de défaillance. Cela signifie que si un module de votre dépend le code n'est pas disponible ou ne parvient pas à charger l'erreur est immédiatement perceptible. En outre,use
appelle automatiquement leimport()
méthode du module si il en a un qui peut vous faire économiser un peu de frappe.require Module
est commeuse Module
sauf que cela se passe au moment de l'exécution et n'appelle pas automatiquement le module deimport()
méthode. Normalement, vous souhaitez utiliseruse
à l'échec tôt et de manière prévisible, mais parfoisrequire
est mieux. Par exemple,require
peut être utilisé pour retarder le chargement de gros modules qui ne sont, à l'occasion, ou pour faire un module optionnel. (c'est à dire utiliser le module, s'il est disponible, mais retomber sur quelque chose d'autre ou de réduire fonctionnalité si elle ne l'est pas.)Strictement parlant, la seule différence entre
require Module
etrequire 'file'
est que la première forme déclencheurs de la traduction automatique à partir d'un nom de package commeFoo::Bar
à un nom de fichier commeFoo/Bar.pm
tandis que le second formulaire attend un nom de fichier pour commencer. Par convention, si, la première forme est utilisée pour le chargement des modules, tandis que la deuxième forme est utilisé pour le chargement des bibliothèques.Il y a une grande préférence pour l'utilisation de
use
, car il arrive à un état antérieurBEGIN {}
lors de la compilation, et les erreurs ont tendance à être transmis à l'utilisateur à un moment plus opportun. Il appelle également lasub import {}
fonction qui donne l'appelant de contrôle sur le processus d'importation. C'est quelque chose qui est fortement utilisé. Vous pouvez obtenir le même effet, par l'appel de l'espace de noms spécifique duimport
, mais qui nécessite de connaître le nom de l'espace de noms, et le fichier, et le code de l'appel à la sous-routine... ce qui est beaucoup plus de travail. À l'inverse,use
, il faut juste que vous sachiez l'espace de noms, et puis il a besoin du fichier avec l'espace de noms correspondant -- donc de faire le lien entre les espaces de noms et les fichiers de moins en moins consciente de l'utilisateur.Lire
perldoc -f
, etperldoc -f, exigent
, pour plus d'informations. Parperldoc -f
:use
est le même queBEGIN { require Module; Module->import( LIST ); }
Qui est beaucoup plus laid.La principale différence est autour d'importation/exportation.
use
est préféré lorsque vous êtes faisant usage d'un module, car il vous permet de spécifier les routines que vous souhaitez importer dans votre espace de noms :use
donne également des pistes pour le moduleimport()
procédure qui est souvent utilisé pour définir le module vers le haut.Voir perldoc pour utilisation pour plus de détails.
MyModule::import()
est accepterqw(foo bar baz)
et l'exportation elle-même. C'est la même facilité,Exporter
, etSub::Exporter
tout simplement de générer uneimport()
.À l'aide de
use
module comprendra module au cours de la compilation qui augmente la vitesse mais utilise plus de mémoire, tandis que l'utilisation derequire
module devra inclure au moment de l'exécution. Nécessitant un module sans l'aide d'importation lorsque nécessaire, utilise moins de mémoire, mais réduit la vitesse.