2008-10-09 14 views
6

Tengo un paquete que acabo de crear y tengo un "modo antiguo" que básicamente hace que funcione como antes: importar todo en el espacio de nombres actual. Una de las cosas buenas de tener esto como un paquete es que ya no tenemos que hacer eso. De todos modos, lo que me gustaría hacer es tener de manera que cada vez que alguien hace:¿Cómo puedo hacer que Perl dé un mensaje de advertencia cuando se importa un determinado paquete/etiqueta?

use Foo qw(:oldmode); 

lanzo una advertencia de que esta no se utiliza y que deberían ya sea de importación sólo lo que necesitan acceso o simplemente con funciones foo-> divertido();

¿Alguna idea sobre cómo hacer esto?

Respuesta

11

Bueno, como usted afirma específicamente que desea alarma en los casos de use Mod qw<:oldmode>; esto funciona mejor:

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')}; 
} 

Gracias a Frew, por mencionar la sintaxis partido inteligente Perl 5.10. Estoy aprendiendo todas las formas de trabajar con Perl 5.10 en mi código.

Nota: la forma estándar para utilizar en un exportador sub importación ha de manipular ya sea $Exporter::ExportLevel o llamar Foo->export_to_level(1, @_); Pero me gusta la forma anteriormente. Es más rápido y, creo, más simple.

+0

Bueno, realmente hiciste lo mismo que moritz excepto que especificaste la declaración if, ¿verdad? Quiero decir, si pongo if (@_ ~~ ': oldmode') {carp 'blah';} en el suyo, ¿sería el mismo derecho? –

12

Usted escribe su propio sub import en package Foo que se llamará con la lista de parámetros de use Foo.

Un ejemplo:

package Foo; 
use Exporter; 

sub import { 
    warn "called with paramters '@_'"; 

    # do the real import work 
    goto &{Exporter->can('import')}; 
} 

Así que en sub import puede buscar en la lista de argumentos para la etiqueta obsoleta, y luego lanzar una advertencia.

Actualización: Como señala Axeman, debe llamar al goto &{Exporter->can('import')}. Esta forma de goto reemplaza la llamada de subrutina actual en la pila, conservando los argumentos actuales (si los hay). Eso es necesario porque el método import() de Exporter exportará al espacio de nombres de su interlocutor.

Cuestiones relacionadas