in reply to Re^2: How do closures and variable scope (my,our,local) interact in perl?
in thread How do closures and variable scope (my,our,local) interact in perl?
.. but when the same is done in a loop, with a lexical variable declared beforehand, the result changes:
because a loop is a block of it's own which changes. IIRC the essence of closures is that whenever the outer block is entered (decided at run-time!) the my variables are associated to another lexpad (please correct my terminology if I name something wrong).
so with
for my $var ( 1,2,3) { my $x =sub {print $var } }
the opcode for $var points for each run into different instances of the lexpads of the for loop.
UPDATE ----
it's more like this in pseudocode
while ( $LEXPAD{for-block}={}; "$LEXPAD{for-block}"->{var} = (1,2,3)- +>next() ) { my $x =sub { print "$LEXPAD{for-block}"->{var} } }
----- UPDATE
OTOH there is nothing like a "closure with packagevars", they always point to the same symboltable (decided at compile-time!)
Now the extra complexity comes because ELISHEVA declares the loop variable in advance with my / our, which implies localising, i.e. saving and restoring the variable at runtime. (Nota bene: Normally there is nothing like local() with lexvars)
Cheers Rolf
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: How do closures and variable scope (my,our,local) interact in perl?
by Corion (Patriarch) on Jun 16, 2009 at 16:14 UTC | |
by LanX (Saint) on Jun 16, 2009 at 16:51 UTC |