爲了學習的目的,我正忙於在Perl中構建事件驅動程序 ,並注意到如果被註冊爲事件處理程序的 子例程在失敗時可能會很好,而 只是安排另一個調用自己在以後的時間。到目前爲止,我有 想出這樣的事情:在Perl中,子程序如何獲取指向自身的代碼參考?
my $cb;
my $try = 3;
$cb = sub {
my $rc = do_stuff();
if (!$rc && --$try) {
schedule_event($cb, 10); # schedule $cb to be called in 10 seconds
} else {
do_other_stuff;
}
};
schedule_event($cb, 0); # schedule initial call to $cb to be performed ASAP
是有辦法的子裏面的代碼可以訪問CODEREF到 子,所以我可以不使用額外的變量呢?我想 安排這樣的初始呼叫。
schedule_event(sub { ... }, 0);
使用caller(0)[3]
我首先想到的,但這只是給了我一個 函數名,(如果沒有名稱),而不是代碼的參考 具有附加給它墊。
真的很酷的問題。 – 2010-03-31 15:48:57
如果在程序的同一運行過程中執行此操作很多,則由於循環引用會導致內存泄漏。您可以使用Scalar :: Util :: weaken()來避免這種情況,或者使用Sub :: Current或Y-combinator,如下所示。參見http://use.perl.org/~Aristotle/journal/30896進行討論。如果此代碼不在持久環境中,則上面的代碼可能沒問題。 – runrig 2010-03-31 16:18:28
runrig:感謝您的鏈接。我的頭正在旋轉。 :-)也許我真的會去學點東西...... – hillu 2010-03-31 20:57:33