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.