2011-07-29 28 views
-1
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 }; 

有沒有人可以解釋這一點?爲什麼調用Module :: Refresh-> refresh會被重定向到Module :: Refresh :: CODE?

UPDATE

這似乎是由該塊造成的:

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 }; 
    } 

} 

但是,爲什麼?有什麼不同??

回答

2

如果你真的讀了這段代碼上面的註釋,你早就知道的回答你的問題:

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

傑西在那裏做一些沉重的巫術,以使模塊能夠重新加載本身(同時在重新載入之前取消它自己的公共接口)。

+0

是的,我讀了那條評論,但是我沒有看到**如何**它可以實現目標.. – asker

+0

你有沒有試過用'perl -d'調試這個模塊,它總是掛在這裏...... – asker

+0

在重新加載時,模塊刪除(命名的)蹦牀,而不是原始(匿名)的子彈。只有在重新加載後,原件纔會被刪除,當它們被垃圾收集時。 –