gpt4 book ai didi

perl - 如何在 perl 中取消导入函数?

转载 作者:行者123 更新时间:2023-12-04 13:05:24 26 4
gpt4 key购买 nike

我正在尝试删除导入的符号,以便它们不能作为对象中的方法使用,但是 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;

不幸的是我不能使用 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 的代码 Not Acceptable ,为什么来自 StackOverflow 的代码可以接受?

关于perl - 如何在 perl 中取消导入函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10306916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com