LPM: Scope of $_

Frank Price fprice at mis.net
Tue Jan 11 21:22:38 CST 2000


On Tue, 11 Jan 2000, David Hempy wrote:

#  Okay, I'm either confused or disappointed about the scope of $_ ... tell me
#  which.

[snip]

# rtf2html() uses $_ internally to do some stuff.  After it returns, $_ in
# scout.pl has the last value of rtf2html::$_ .  The message "$_ has changed
# at BBB!" gets printed out.
# 
# I'm really confused by this.  I had assumed that $_ is scoped like my
# variables.  It certainly doesn't appear that way to me now.  In this
# example, the subroutine is in a different module with its own package,
# which is particularly disappointing.  Heck, I expected subroutines within
# the same .pl file to have their own $_ !  

Not sure about your own internal states, but I think you've
illustrated a good point: don't depend upon $_ !!.  On perl.com there
was an article called the Seven Sins of Perl Revisited which mentioned
this very thing.  Far from $_ being lexically scoped, it and the other
magical vars like $/, etc. are the only true globals in Perl since
they are the same across namespaces.

# All of a sudden I'm a bit nervous about using $_ through an entire
# subroutine, assuming that no deeper subroutines can/will affect it.  Of
# course I can copy $_ to my variables, but that takes some of the magic away
# from things like: 
# 
# 	s/\n/<p>/g;

I usually explicitly name the loop var: foreach my $value (@values)

# So you tell me...am I confused or disappointed?  I looked in Learning Perl
# and Programming Perl, but didn't find the answer.  Is there something I can
# do to protect $_ ?  I tried my ($_) but perl didn't like that.

Right, my $_ won't work.  I think that in your module you could do
local $_ to create your private copy though.


-Frank.





More information about the Lexington-pm mailing list