Я видел этот бит кода в ответе на другой пост: 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!
В приведенном выше примере, я получил предупреждение: «Переменная $ а не будет оставаться совместно на линии 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, для закрытия в скомпилированный код просто сочетается с новой средой/областью, в результате чего появляется новое резюме, тогда как названные субтитры никогда не восстанавливаются до новой области (без переопределения). – amon
Большое спасибо, это было очень полезно! –