2012-04-24 42 views
6

Tôi đang cố xóa các ký hiệu được nhập để chúng không khả dụng dưới dạng các phương thức trong đối tượng, nhưng no dường như không hoạt động, có thể tôi không hiểu, hoặc có cách khác.Làm thế nào để unimport một chức năng trong 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; 

tiếc là tôi không thể sử dụng namespace::autoclean vì tôi đã bị hạn chế đến các module mà chỉ là một phần của perl lõi (yeah ngu ngốc nhưng c'est la vie).

mà không cần viết lại namespace::autoclean có cách nào để thực hiện việc này không?

+0

Tại sao bạn không thể làm những gì không gian tên :: tự động làm sạch điều này? Nó làm những gì bạn muốn, nhưng ngay cả khi không sử dụng nó như một mô-đun bạn muốn tránh làm những gì nó làm, như thể nó tồn tại không có lý do chính đáng vì phải có một cách đơn giản hơn để hoàn thành công việc. –

+0

@briandfoy nó có thể là tôi có thể, nhưng tôi figured có thể có một cách đơn giản. – xenoterracide

Trả lời

13

Tôi tin rằng không gian tên :: autoclean xóa glob:

delete $Test0::{carp}; 

Nếu không thể xác định rõ gói:

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

Nếu bạn nhấn mạnh vào lại nghiêm ngặt về, bạn có thể đánh lừa nghiêm ngặt (nhưng không kém phần an toàn):

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

PS — Tại sao mã từ StackOverflow có thể chấp nhận được nếu mã từ CPAN không?

+0

p.s. F * biết. Tôi đang mệt mỏi vì cố gắng để có được tối ưu hóa sớm với NIHS để có được lành mạnh. – xenoterracide

+0

sử dụng kết hợp của điều này và @ IlmariKaronen [answer] (http://stackoverflow.com/a/10307099/206466), có ý nghĩa để không nhập nơi tôi đang sử dụng một lần. – xenoterracide

11

Tôi biết điều này không trực tiếp trả lời câu hỏi của bạn, nhưng cách giải quyết đơn giản là không nhập các hàm ở địa điểm đầu tiên. Điều này sẽ chỉ làm việc tốt:

use Carp(); # import nothing 

Carp::carp 'good'; 
Các vấn đề liên quan