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


in reply to Re: Re: Unusual Closure Behaviour
in thread Unusual Closure Behaviour

Well, technically what is happening is not violating Camel III. See, it *does* get its own scratchpad, which can be quickly checked by:
#!/opt/perl/bin/perl -w use strict; sub foo; sub foo { return unless $_ [0]; my $x if 0; print ++ $x, " "; foo $_ [0] - 1; } foo 1; print "\n"; foo 2; print "\n"; foo 3; print "\n"; foo 4; print "\n"; __END__ 1 2 1 3 2 1 4 3 2 1
Scary, isn't? When the subroutine recurses, it notices there is still a reference to $x and hence it will create a new scratchpad. But when there is no reference, it will reuse an old scratchpad....

I do agree that using my in this way doesn't tend to lead to well understood code. I wouldn't go as far as to say it's never useful, but such cases will be very rare and it's not a technique I would teach in my classes.

-- Abigail

Replies are listed 'Best First'.
Re^2: Unusual Closure Behaviour
by BrowserUk (Patriarch) on Sep 12, 2015 at 23:55 UTC
      This place needs you.

      So true.

      What happens here? Does this mean that each scratchpad is persistent at its recursion level?

      use strict; sub foo; sub foo { return unless $_ [0]; my $x if undef; print ++ $x, " "; foo $_ [0] - 1; } foo 1; print "\n"; foo 2; print "\n"; foo 3; print "\n"; foo 7; print "\n"; foo 11; print "\n"; foo 9; print "\n"; foo 15; print "\n"; __END__ 1 2 1 3 2 1 4 3 2 1 1 1 1 5 4 3 2 2 2 2 1 1 1 1 6 5 4 3 3 3 3 2 2 7 6 5 4 4 4 4 3 3 2 2 1 1 1 1
      perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
Re^2: Unusual Closure Behaviour
by Anonymous Monk on Sep 12, 2015 at 23:24 UTC
    Have you tried this?
    #!/usr/bin/perl use strict; sub foo; sub foo { return unless $_ [0]; my $x if undef; print ++ $x, " "; foo $_ [0] - 1; } foo 29; print "\n";
    It prints:

    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

    Hum...

       Deprecated use of my() in false conditional at - line 6.