Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: Unusual Closure Behaviour

by artist (Parson)
on Jul 12, 2001 at 20:12 UTC ( [id://96088]=note: print w/replies, xml ) Need Help??


in reply to Unusual Closure Behaviour

HI, Try this, Here it says that $x is not defined and therefore it creates a new local variable $x with 'my'.
Otherwise it uses the last value of x which is the default behaviour.
sub foo { my $x if !defined $x; return ++$x; } for (1..7){ print foo(); };

Replies are listed 'Best First'.
(tye)Re2: Unusual Closure Behaviour
by tye (Sage) on Jul 13, 2001 at 03:20 UTC

    Actually, that code isn't doing what you think. One way to see is to just add "use strict" to it. You'll get: Global symbol "$x" requires explicit package name

    A more fun way is:

    sub foo { my $x= $_[0] if ! defined $x; print "(@_):", ++$x, " "; undef $x if @_ && shift; } foo($_) for( 0,0,5,4,3,0,5,0,4,0,3 ); print $/, $x= 10, $/; foo($_) for( 0,0,5,4,3,0,5,0,4,0,3 ); print $/;
    which produces:
    (0):1 (0):1 (5):6 (4):5 (3):4 (0):1 (5):6 (0):1 (4):5 (0):1 (3):4 10 (0):1 (0):2 (5):3 (4):1 (3):1 (0):1 (5):2 (0):1 (4):2 (0):1 (3):2
    The $x in "if !defined $x" is the global $main::x because my variables can't be used until after the end of the statement in which they were declared.

    So your code is always initializing the lexical $x in your subroutine because you have never defined the global $main::x that you are checking against.

            - tye (but my friends call me "Tye")

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (3)
As of 2025-07-17 02:47 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.