Ich sah dieses Bit Code in einer Antwort auf einen anderen Beitrag: Why would I use Perl anonymous subroutines instead of a named one?, konnte aber nicht genau herausfinden, was los ist, also wollte ich es selbst laufen.Gemeinsame Variablen im Kontext von Unterprogrammen vs anonyme Unterprogramme
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!
Im obigen Beispiel erhielt ich eine Warnung: „Variable a $ nicht 15. Offensichtlich in Zeile geteilt bleiben, deshalb ist der Ausgang‚unerwartet‘, aber ich verstehe immer noch nicht wirklich was passiert hier.
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
in diesem Sinne verstehe ich nicht, was entweder in diesem Beispiel passiert. Könnte jemand bitte erklären?
Vielen Dank im Voraus.
„Parsen“ ist wohl das falsche Wort hier, aber „Compilation“ scheint auch etwas falsch: IIRC, für Verschlüsse der kompilierter Code wird nur zu einer neuen Umgebung/einem neuen Bereich kombiniert, was zu einem neuen CV führt, während benannte Subs niemals zu einem neuen Bereich zurückkehren (ohne eine Neudefinition). – amon
Vielen Dank, das war sehr hilfreich! –