我在另一篇文章的答案中看到了這一點代碼:Why would I use Perl anonymous subroutines instead of a named one?,但無法弄清楚到底發生了什麼,所以我想自己運行它。子例程與匿名子例程中的共享變量
sub outer
{
my $a = 123;
sub inner
{
print $a, "\n"; #line 15 (for your reference, all other comments are the OP's)
}
# At this point, $a is 123, so this call should always print 123, right?
inner();
$a = 456;
}
outer(); # prints 123
outer(); # prints 456! Surprise!
在上面的例子中,我收到了警告:「變量$ a不會停留在15行 顯然共享的,這就是爲什麼輸出是‘意外’,但我還是不太懂這裏發生了什麼。
sub outer2
{
my $a = 123;
my $inner = sub
{
print $a, "\n";
};
# At this point, $a is 123, and since the anonymous subrotine
# whose reference is stored in $inner closes over $a in the
# "expected" way...
$inner->();
$a = 456;
}
# ...we see the "expected" results
outer2(); # prints 123
outer2(); # prints 123
本着同樣的精神,我不明白是怎麼發生的事情或者在這個例子中,可能有人請解釋一下嗎?
在此先感謝。
「分析」可能是錯一個字在這裏,但「彙編」似乎稍有不妥太:IIRC,閉包的編譯後的代碼只是合併到一個新的環境/作用域中,導致一個新的CV,而named subs不會重新映射到一個新的作用域(沒有重新定義)。 – amon 2013-05-07 18:05:19
非常感謝,這非常有幫助! – 2013-05-07 18:39:49