Eric Strom cevabı doğrudur ve muhtemelen ne görmek istedim, ama bağlamanın detaylarına girmiyor.
sözcük yaşam süresi ile ilgili kısa bir not: lexicals derleme zamanında oluşturulan ve bu örnekte görüldüğü gibi, onların kapsamı girilir önce bile aslında temin edilebilir:
my $i;
BEGIN { $i = 42 }
print $i;
Bundan sonra, onlar kapsam dışında gitmek, onlar onlar kapsamındadır dahaki sefere kadar kullanılamaz hale: kodunuzda
print i();
{
my $i;
BEGIN { $i = 42 }
# in the scope of `my $i`, but doesn't actually
# refer to $i, so not a closure over it:
sub i { eval '$i' }
}
print i();
, kapatma derleme zamanında ilk sözcük $i
bağlıdır. Ancak, foreach döngüler biraz garip; my $i
aslında bir sözcük oluştururken, foreach döngüsü bunu kullanmaz; bunun yerine, her yinelemeli döngü değerlerinden birine takma ve sonra döngüden sonra özgün durumuna geri yükler. Kapanışınız bu nedenle orijinal sözlüksel $i
referans veren tek şeydir.
hafif varyasyon daha fazla karmaşıklık gösterir: Burada
foreach (@foo) {
my $i = $_;
sub printer {
my $blah = shift @_;
print "$blah-$i\n";
}
printer("test");
}
, orijinal $i
derleme zamanında oluşturulur ve kapama o bağlanır; Döngünün ilk yinelemesi onu ayarlar, ancak döngünün ikinci yinelemesi, kapanma ile ilişkisiz yeni bir $i
oluşturur.
çok ilginç, teşekkürler – Snark