如何在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;

不幸的是我不能使用namespace::autoclean,因为我被限制在仅仅是核心perl的一部分的模块(是的愚蠢但c’est la vie).

不只是重写namespace :: autoclean有没有办法做到这一点?

解决方法

我相信namespace :: autoclean删除了glob:
delete $Test0::{carp};

没有硬编码包:

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

如果你坚持严格要求,你可以严格愚弄(但不是更安全或更不安全):

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

PS – 如果来自CPAN的代码不是,为什么StackOverflow的代码可以接受?

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...