【问题标题】:How do I unimport a function in perl?如何在 perl 中取消导入函数?
【发布时间】:2012-04-25 10:58:41
【问题描述】:

我正在尝试删除导入的符号,以便它们不能作为对象中的方法使用,但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 一部分的模块中(是的,很愚蠢,但这是我的生活)。

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

【问题讨论】:

  • 为什么你不能做什么 namespace::auto clean 这样做?它做你想做的事,但即使不将它用作模块,你也想避免做它做的事,好像它的存在没有充分的理由,因为必须有一种更简单的方法来完成工作。
  • @briandfoy 我有可能,但我想可能有更简单的方法。

标签: perl


【解决方案1】:

我相信 namespace::autoclean 会删除 glob:

delete $Test0::{carp};

无需对包进行硬编码:

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

如果你坚持让 strict

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

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

【讨论】:

  • 附注F*知道。我已经厌倦了试图让 NIHS 的过早优化器变得理智。
  • 结合使用这个和@IlmariKaronen 的answer,不导入我使用过的地方是有意义的。
【解决方案2】:

我知道这并不能直接回答您的问题,但一个简单的解决方法是首先不导入函数。这会很好用:

use Carp ();  # import nothing

Carp::carp 'good';

【讨论】:

    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2022-09-30
    • 1970-01-01
    相关资源
    最近更新 更多