... [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.