http://www.perlmonks.org?node_id=115691


in reply to Funkyness with closures...

... [f()] gets a copy of the package variable $x ...

No, it doesn't. Oddly enough it appears to get it's own seperate variable. For example let's try:

#!/usr/bin/perl -w use strict; use vars qw($x); $x = "global"; { my $x = 'A'; sub f { sub { $x++ } } sub g { sub { $x++ } if $x } } my $F=f(); my $G=g(); print $F->(),$G->(),"," for 1..4; print f()->(), g()->(),"," for 1..4; print $x; print "\n"; print f(), ",", $F; print "\n";

The output is "0A,1B,2C,3D,4E,5F,6G,7H,global" (update: followed by two different CODE(0x12345678) strings) This indicates that, somehow, the subroutine generated by f() is getting its own, independent lexical variable shared between all copies of the anonymous subroutine (with apparently different coderefs). Weirder.

Replies are listed 'Best First'.
(MeowChow) Re2: Funkyness with closures...
by MeowChow (Vicar) on Sep 30, 2001 at 21:36 UTC
    Stranger and stranger...
      
    use strict; use warnings; { my $x = 'A'; sub f { sub { $x++ } } sub g { sub { $x++ } } } my $F=f(); my $G=g(); print $F->(),$G->(),"," for 1..4; ### RESULT ### 01,23,45,67,
    So the $F and $G closures now share $x, albeit not the one that was originally instantiated!

    It's also interesting that when the lexical scope is wrapped up inside of a BEGIN block, all these problems go away...

       MeowChow                                   
                   s aamecha.s a..a\u$&owag.print