为什么调用Module :: Refresh->刷新被重定向到Module :: Refresh :: CODE?

时间:2011-07-29 08:39:03

标签: perl

PerlConsole::Console::interpret(/home/perlconsole-0.4/lib/PerlConsole/Console.pm:281):
281:        Module::Refresh->refresh;
  DB<5> s
Module::Refresh::CODE(0x70a340)(/home/perlconsole-0.4/depends/Module-Refresh-0.16/lib/Module/Refresh.pm:205):
205:            *$sym = sub { goto &$code };

这里有没有人可以解释这个?

更新

这似乎是由这个块引起的:

BEGIN {
    no strict 'refs';
    foreach my $sym ( sort keys %{ __PACKAGE__ . '::' } ) {
    next
        if $sym eq
        'VERSION';    # Skip the version sub, inherited from UNIVERSAL
    my $code = __PACKAGE__->can($sym) or next;
    delete ${ __PACKAGE__ . '::' }{$sym};
    *$sym = sub { goto &$code };
    }

}

但为什么呢?有什么区别??

1 个答案:

答案 0 :(得分:2)

如果您确实已经阅读了上述代码段的注释,那么您已经知道了问题的答案:

# "Anonymize" all our subroutines into unnamed closures; so we can safely
# refresh this very package.

Jesse正在做一些沉重的巫术,以使模块能够重新加载自己(在重新加载之前取消它自己的公共接口)。