2008-10-09 21 views
6

J'ai un paquet que je viens de faire et j'ai un "vieux mode" qui le fait fonctionner comme avant: importer tout dans l'espace de noms courant. L'une des bonnes choses à propos de ce paquet est que nous n'avons plus à le faire. Quoi qu'il en soit, ce que je voudrais faire est d'avoir pour que chaque fois que quelqu'un fait:Comment puis-je demander à Perl de donner un message d'avertissement lorsqu'un certain paquet/tag est importé?

use Foo qw(:oldmode); 

Je jette un avertissement que cela est dépréciée et qu'ils ne doivent soit importer seulement ce dont ils ont besoin ou fonctions avec accès juste Foo-> amusement();

Des idées sur comment faire cela?

Répondre

11

Eh bien, comme vous dites précisément que vous voulez 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, pour mentionner la syntaxe de Perl 5.10 smart correspondance. J'apprends toutes les façons de travailler Perl 5.10 dans mon code.

Note: la manière standard d'utiliser exportateur dans un sous d'importation est soit manipuler $Exporter::ExportLevel ou appeler Foo->export_to_level(1, @_); Mais j'aime la façon ci-dessus. C'est plus rapide et, je pense, plus simple.

+0

Eh bien, vraiment, vous avez fait la même chose est moritz, sauf spécifié la déclaration if, non? Je veux dire, si je mets if (@_ ~~ ': oldmode') {carp 'blah';} dans le sien serait le même droit? –

12

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, en sous import vous pouvez rechercher la liste des arguments pour la balise désapprouvée, puis jeter un avertissement.

Mise à jour: Comme le souligne Axeman, vous devez appeler le goto &{Exporter->can('import')}. Cette forme de goto remplace l'appel de sous-routine en cours sur la pile, en conservant les arguments actuels (le cas échéant). Cela est nécessaire car la méthode import() de Exportateur exportera vers l'espace de noms de l'appelant.