Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: Unusual Closure Behaviour

by Abigail (Deacon)
on Jul 13, 2001 at 14:26 UTC ( [id://96339]=note: print w/replies, xml ) Need Help??


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.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2025-07-16 15:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.