如何在perl中取消导入函数?
发布时间:2020-12-15 21:58:47 所属栏目:大数据 来源:网络整理
导读:我正在尝试删除导入的符号,以便它们作为对象中的方法不可用,但似乎没有用,可能我不理解否,或者还有另一种方法. use 5.014;use warnings;use Test::More;# still has carp after no carppackage Test0 { use Carp qw( carp ); sub new { my $class = shift; m
我正在尝试删除导入的符号,以便它们作为对象中的方法不可用,但似乎没有用,可能我不理解否,或者还有另一种方法.
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的代码可以接受? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |