Comment puis-je obtenir que Perl envoie un message d'avertissement lorsqu'un certain package / tag est importé?

StackOverflow https://stackoverflow.com/questions/187531

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top