Beefy Boxes and Bandwidth Generously Provided by pair Networks Frank
The stupid question is the question not asked
 
PerlMonks  

(dchetlin - static vs. closure) RE(3): lexical weirdness(?)

by dchetlin (Friar)
on Oct 26, 2000 at 07:42 UTC ( #38549=note: print w/ replies, xml ) Need Help??


in reply to RE: RE: lexical weirdness(?)
in thread lexical weirdness(?)

There are at least two major differences between closures and static-via-my-if-0 variables.

Here's the first. Look closely at this code and see if you can figure out what its output will be before you run it.

#!/usr/bin/perl -w use strict; { my $closure; sub func_w_closure { print "Closure! ", $closure++, "\n"; func_w_closure($_[0]+1) if $_[0] < 3; } } sub func_w_static { my $static if 0; print "Static! ", $static++, "\n"; func_w_static($_[0]+1) if $_[0] < 3; } func_w_closure(0); func_w_static(0);

I'll use tilly's spoiler trick:

[~] $ dev/test/scope.pl Closure! 0 Closure! 1 Closure! 2 Closure! 3 Static! 0 Static! 0 Static! 0 Static! 0

In other words, the closure is the same variable through all calls, including recursive ones, while each recursive call to the func_w_static gets its own copy.

The cool thing about that, of course, is that if you call func_w_closure again, you see that each recursive instance keeps its value!

The other difference is that closures can be shared among functions -- if you stick another function into the lexical scope of `$static' above, some_function and your new function will refer to the same variable.

-dlc


Comment on (dchetlin - static vs. closure) RE(3): lexical weirdness(?)
Select or Download Code

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (4)
As of 2014-04-20 21:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (488 votes), past polls