我正在尝试删除导入的符号,以便它们作为对象中的方法不可用,但no似乎不起作用,也许我不理解否,或者还有另一种方法.
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;
Run Code Online (Sandbox Code Playgroud)
不幸的是我不能使用namespace :: autoclean,因为我一直被限制在仅仅是核心perl的一部分的模块中(是的愚蠢而且是c'est la vie).
没有重写namespace::autoclean是有办法做到这一点?
ike*_*ami 13
我相信namespace :: autoclean删除了glob:
delete $Test0::{carp};
Run Code Online (Sandbox Code Playgroud)
没有硬编码包:
my $pkg = do { no strict 'refs'; \%{ __PACKAGE__."::" } };
delete $pkg->{carp};
Run Code Online (Sandbox Code Playgroud)
如果你坚持严格要求,你可以严格愚弄(但不是更安全或更不安全):
my $pkg = \%::;
$pkg = $pkg->{ $_ . '::' } for split /::/, __PACKAGE__;
delete $pkg->{carp};
Run Code Online (Sandbox Code Playgroud)
PS - 如果来自CPAN的代码不是,为什么StackOverflow的代码可以接受?
Ilm*_*nen 11
我知道这并没有直接回答你的问题,但一个简单的解决方法是不首先导入函数.这将工作得很好:
use Carp (); # import nothing
Carp::carp 'good';
Run Code Online (Sandbox Code Playgroud)