Perl's a great language for special variables - variables that are set up without the programmer having to intervene and providing information ranging from the number of lines read from the current input file ($.) through the current process ID ($$) and the operating system ($^O). Other special variables effect how certain operations are performed ($| controlling output buffering / flushing, for example), or are fundamental in the operation of certain facilities - no more so than $_ and @_.
Lets clear a misconception.
$_ and
@_ are
different variables. In Perl, you can have a list and a scalar of the same name, and they refer to unrelated pieces of memory.
$_ is known as the "default input and pattern matching space". In other words, if you read in from a file handle at the top of a
while loop, or run a
foreach loop and don't name a loop variable, $_ is set up for you. Then any regular expression matches,
chops (and
lcs and many more) without a parameter, and even
prints assume you want to work on $_. Thus:
while ($line = <FH>) {
if ($line =~ /Perl/) {
print FHO $line;
}
print uc $line;
}
Shortens to:
while (<FH>) {
/Perl/ and
print FHO ;
print uc;
}
@_ is the list of incoming parameters to a sub. So if you write a sub, you refer to the first parameter in it as
$_[0], the second parameter as
$_[1] and so on. And you can refer to
$#_ as the index number of the last parameter:
sub demo {
print "Called with ",$#_+1," params\n";
print "First param was $_[0]\n";
Note that the
English module adds in the ability to refer to the special variables by other longer, but easier to remember, names such as @ARG for @_ and $PID for $$. But
use English; can have a detrimental performance effect if you're matching regular expressions against long incoming strings.
(written 2006-12-07 01:59:46)
Associated topics are indexed under
P209 - Subroutines in PerlP210 - Perl - Topicalization and Special Variables
Some other Articles
Too much used to SkypeBoth one team and twoWiltshire letterboxesString duplication - x in Perl, * in Python and RubyPerl - $_ and @_Perl - a list or a hash?Realistic on line shoot'em upCSL, KISS and RTFMKISS - one action per statement please - PerlPractical polymorphism in action