2011-07-29 4 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

リロード時に、モジュールは元の(匿名化された)サブスロットではなく、(名前付きの)トランポリンを削除します。オリジナルは、再ロード後にガベージコレクションされたときにのみ削除されます。 –

関連する問題