Ho visto questo bit di codice in una risposta a un altro post: Why would I use Perl anonymous subroutines instead of a named one?, ma non riuscivo a capire esattamente cosa succedeva, quindi volevo eseguirlo da solo.Variabili condivise nel contesto di subroutine vs subroutine anonime
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!
Nell'esempio di cui sopra, ho ricevuto un avvertimento: "variabile $ a non rimarrà condiviso a linea 15. Ovviamente, questo è il motivo per cui l'uscita è 'inaspettato', ma io ancora non capisco cosa sta succedendo qui.
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
Allo stesso modo, non capisco cosa sta succedendo in questo esempio sia. qualcuno potrebbe spiegare?
Grazie in anticipo.
“Analisi” è probabilmente la parola sbagliata qui, ma “compilation” sembra troppo leggermente sbagliato: IIRC, per le chiusure delle il codice compilato viene semplicemente combinato con un nuovo ambiente/ambito, risultando in un nuovo CV, mentre i sottotitoli con nome non sono mai in un nuovo ambito (senza una ridefinizione). – amon
Grazie mille, è stato molto utile! –