Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

Re: Funkyness with closures...

by wog (Curate)
on Sep 30, 2001 at 04:46 UTC ( #115691=note: print w/replies, xml ) Need Help??

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

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

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://115691]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (7)
As of 2020-09-21 18:38 GMT
Find Nodes?
    Voting Booth?
    If at first I donít succeed, I Ö

    Results (126 votes). Check out past polls.