2012-04-24 11 views
6

Estoy tratando de eliminar los símbolos que se importan para que no estén disponibles como métodos en el objeto, pero no no parece funcionar, tal vez no entiendo no, o hay otra manera.¿Cómo desactivo una función en Perl?

use 5.014; 
use warnings; 
use Test::More; 

# still has carp after no carp 
package Test0 { 
    use Carp qw(carp); 
    sub new { 
     my $class = shift; 
     my $self = {}; 

     carp 'good'; 

     bless $self, $class; 
     return $self; 
    } 
    no Carp; 
} 

my $t0 = Test0->new; 

ok(! $t0->can('carp'), 'can not carp'); 

# below passes correctly 
package Test1 { 
    use Carp qw(carp); 
    use namespace::autoclean; 

    sub new { 
     my $class = shift; 
     my $self = {}; 

     carp 'good'; 

     bless $self, $class; 
     return $self; 
    } 
} 
my $t1 = Test1->new; 
ok(! $t1->can('carp'), 'can not carp'); 
done_testing; 

lamentablemente no puedo usar namespace::autoclean porque he estado restringido a los módulos que son sólo una parte del núcleo de Perl (sí estúpida, pero c'est la vie).

sin solo reescribir namespace::autoclean ¿hay alguna manera de hacerlo?

+0

¿Por qué no puedes hacer qué namespace :: auto clean hace esto? Hace lo que quiere, pero incluso sin usarlo como módulo, quiere evitar hacer lo que hace, como si existiera sin una buena razón, ya que debe haber una forma más sencilla de hacer el trabajo. –

+0

@briandfoy es posible que yo pudiera, pero pensé que podría haber una manera más simple. – xenoterracide

Respuesta

13

que creen espacios de nombres :: autoclean elimina el pegote:

delete $Test0::{carp}; 

Sin codificar el paquete:

my $pkg = do { no strict 'refs'; \%{ __PACKAGE__."::" } }; 
delete $pkg->{carp}; 

Si insiste en dejar estricta en, puede engañar estrictamente (pero no es más o menos seguro):

my $pkg = \%::; 
$pkg = $pkg->{ $_ . '::' } for split /::/, __PACKAGE__; 
delete $pkg->{carp}; 

PS — ¿Por qué es aceptable el código de StackOverflow si el código de CPAN no es aceptable?

+0

p.s. F * sabe. Estoy cansado de intentar obtener optimizadores prematuros con NIHS para ponerme en forma. – xenoterracide

+0

usando una combinación de esto y @ IlmariKaronen [respuesta] (http://stackoverflow.com/a/10307099/206466), tiene sentido no importar donde estoy usando una vez. – xenoterracide

11

Sé que esto no responde directamente a su pregunta, pero una solución simple es no importar las funciones en primer lugar. Esto funciona muy bien:

use Carp(); # import nothing 

Carp::carp 'good'; 
Cuestiones relacionadas