Comment puis-je obtenir que Perl envoie un message d'avertissement lorsqu'un certain package / tag est importé?
Question
J'ai un paquet que je viens de faire et j'ai un & "old-mode &"; en gros, cela fonctionne comme avant: importer tout dans l’espace de noms actuel. L’un des avantages de ce système est que nous n’avons plus à le faire. Quoi qu’il en soit, ce que je voudrais faire, c’est de le faire de sorte que chaque fois que quelqu'un le fait:
use Foo qw(:oldmode);
Je vous avertis que cela est obsolète et qu'ils doivent importer uniquement ce dont ils ont besoin ou simplement accéder aux fonctions avec Foo - > fun ();
Avez-vous des idées sur la façon de procéder?
La solution
Eh bien, comme vous le précisez, vous souhaitez déclencher une alarme dans les cas de use Mod qw<:oldmode>;
Cela fonctionne mieux:
package Foo;
use base qw<Exporter>;
use Carp qw<carp>;
...
sub import {
#if ( grep { $_ eq ':oldmode' } @_ ) { # Perl 5.8
if ( @_ ~~ ':oldmode' ) { # Perl 5.10
carp( 'import called with :oldmode!' );
}
goto &{Exporter->can( 'import' )};
}
Merci à Frew d’avoir mentionné la syntaxe de correspondance intelligente Perl 5.10. J'apprends toutes les façons d'intégrer Perl 5.10 dans mon code.
Remarque: la méthode standard pour utiliser l'exportateur dans un sous-importateur d'importation consiste à manipuler $Exporter::ExportLevel
ou à appeler Foo->export_to_level( 1, @_ );
. Mais j'aime la manière ci-dessus. C'est plus rapide et, je pense, plus simple.
Autres conseils
Vous écrivez votre propre sub import
dans package Foo
qui sera appelé avec la liste de paramètres de use Foo
.
Un exemple:
package Foo;
use Exporter;
sub import {
warn "called with paramters '@_'";
# do the real import work
goto &{Exporter->can('import')};
}
Donc, sous import
, vous pouvez rechercher la balise déconseillée dans la liste des arguments, puis émettre un avertissement.
Mise à jour : comme le souligne Axeman, vous devez appeler goto &{Exporter->can('import')}
. Cette forme de goto remplace l'appel de sous-routine en cours sur la pile, en préservant les arguments en cours (le cas échéant). Cela est nécessaire car la méthode import () de l'exportateur exporte vers l'espace de noms de l'appelant.