에릭 스트롬의 대답은 정확한지, 아마 무엇을 보고 싶었지만 바인딩의 세부 사항에 들어 가지 않습니다.
어휘 수명에 대한 간단한 참고 사항 : lexicals이 컴파일시에 생성이 예와 같이, 그 범위를 입력하기도 전에 실제로 가능하다 :
my $i;
BEGIN { $i = 42 }
print $i;
을 그 후에, 그들은 범위 밖으로 갈 때, 그들은 그들이 범위에있는 다음 시간까지 사용할 수 없게됩니다 : 당신의 코드에서
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();
을 폐쇄는 컴파일시에 초기 어휘 $i
에 바인딩됩니다. 그러나 foreach 루프는 약간 이상합니다. my $i
은 실제로 어휘를 생성하지만 foreach 루프는이를 사용하지 않습니다. 대신 반복되는 각 값의 반복 값 중 하나에 별칭을 지정하고 루프 이후 원래 상태로 복원합니다. 따라서 클로저가 원래 어휘 $i
을 참조하는 유일한 것입니다.
약간의 변동이 더 복잡 나타낸다 : 여기
foreach (@foo) {
my $i = $_;
sub printer {
my $blah = shift @_;
print "$blah-$i\n";
}
printer("test");
}
원래 $i
컴파일시에 작성되어 상기 클로저는 결합; 루프의 첫 번째 반복이 루프를 설정하지만 루프의 두 번째 반복은 클로저와 연결되지 않은 새 $i
을 만듭니다.
매우 흥미 롭습니다. 감사합니다. – Snark