55 votes

En Perl, vaut-il mieux utiliser un module que d’exiger 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:

  1. 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';
  2. Quelle est la différence entre require ModuleName et require "file.pl"?
  3. Est-ce toujours une bonne idée d'utiliser require "file.pl"? Pourquoi ou pourquoi pas?

77voto

Michael Carman Points 21983

La pratique Standard consiste à utiliser use la plupart du temps, require de temps en temps, do rarement.

do 'file' execute file comme un script Perl. C'est presque comme appelant eval sur le contenu du fichier; si vous do 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 entre do et eval que do 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' , c'est comme do '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 pour do 'file' , mais il est encore seulement adapté pour les mêmes gestes simples.

L' do 'file' et require 'file' des 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 c'est la manière normale de l'aide de code à partir d'un module. Notez que Module 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 l' import() méthode du module si il en a un qui peut vous faire économiser un peu de frappe.

require Module , c'est comme use Module , sauf que cela se passe au moment de l'exécution et n'appelle pas automatiquement le module import() méthode. Normalement, vous souhaitez utiliser use à l'échec tôt et de manière prévisible, mais parfois, require , c'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 et require 'file' , c'est que la première forme déclencheurs de la traduction automatique à partir d'un nom de package comme Foo::Bar d'un nom de fichier comme Foo/Bar.pm alors que la dernière forme s'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.

9voto

Evan Carroll Points 13420

Il y a une grande préférence pour l'utilisation d' use, car il arrive à un état antérieur BEGIN {} lors de la compilation, et les erreurs ont tendance à être transmis à l'utilisateur à un moment plus opportun. Il appelle également l' sub 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 de l' import, 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 use, et perldoc -f require, pour plus d'informations. Par perldoc -f use:
use est le même que BEGIN { require Module; Module->import( LIST ); } ce Qui est beaucoup plus laid.

7voto

mopoke Points 6437

La principale différence concerne les importations / exportations. use est préférable lorsque vous utilisez un module car il vous permet de spécifier les routines que vous souhaitez importer dans votre espace de noms:

 use MyModule qw(foo bar baz); # allows foo(), bar() and baz() to be used

use MyModule qw(); # Requires explicit naming (e.g. MyModule::foo).
 

use donne aussi court du module import() procédure qui est souvent utilisé pour définir le haut du module.

Voir le perldoc à utiliser pour plus de détails.

3voto

linuxrules94 Points 102

L'utilisation de use par module inclura le module pendant le temps de compilation, ce qui augmente la vitesse, mais utilise plus de mémoire, alors que l'utilisation du module require inclura pendant le temps d'exécution. Exiger un module sans recourir à l'import en cas de besoin consomme moins de mémoire mais réduit la vitesse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X