Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
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 goofing around in the Monastery: (3)
As of 2024-04-26 06:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found