http://qs321.pair.com?node_id=274127


in reply to $_ scoping issues

See $_ haters anonymou for a discussion of the scoping of $_.

If you wish to use it widely in loops, then it is up to you to either localize it before calling anything that manipulates it, or to localize it before assigning to it.

It is, of course, better to never assign to $_ without localizing it, but you can't always control other people's code. Therefore the paranoid call local on $_ early and often.

Replies are listed 'Best First'.
Re: Re: $_ scoping issues
by pemungkah (Priest) on Jul 15, 2003 at 16:18 UTC
    All very correct. To specifically state it: $_ is a global variable, and is shared between all packages.

    This means that if you use it, you should use local() to be polite to your callers, and you should be careful to insulate yourself from code that may alter it.

    This can be a difficult proposition if you didn't write the code yourself (and sometimes even if you did!). Generally, you have to look at each appllication of $_ and judge on a case-by-case basis whether someone else may be modifying it while you're using it.

    Your best protection is to get into the habit of always localizing it yourself, so as not to step on someone else's toes, and to not trust that code you call has always been so polite.

      To more precisely state it, no matter what package has been declared, $_ means $main::_.

      As an amusing side effect, the declaration our $_; will (if you are in any package other than main) cause your explicit references to $_ to not be the $_ that you expect...

      thanks guys, these are the kind of things that a former C programmer needs to learn about programming in perl =)

      these forums are terrific, I've learned a lot over the last day browsing through the nodes. What a helpful community!