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.
Illustration - a delegate at Well House Manor on a Perl Course (written 2006-12-07, updated 2010-06-22)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
P210 - Perl - Topicalization and Special Variables [493] Running a Perl script within a PHP page - (2005-11-12)
[639] Progress bars and other dynamic reports - (2006-03-09)
[1136] Buffering output - why it is done and issues raised in Tcl, Perl, Python and PHP - (2007-04-06)
[1221] Bathtubs and pecking birds - (2007-06-07)
[1232] Bathtub example - (2007-06-14)
[1289] Pure Perl - (2007-08-03)
[1444] Using English can slow you right down! - (2007-11-25)
[1508] How not to write Perl? - (2008-01-15)
[1704] Finding operating system settings in Perl - (2008-07-10)
[1705] Environment variables in Perl / use Env - (2008-07-11)
[1728] A short Perl example - (2008-07-30)
[1829] Dont bother to write a Perl program - (2008-10-10)
[1860] Seven new intermediate Perl examples - (2008-10-30)
[1922] Flurinci knows Raby Lae PHP and Jeve - (2008-12-04)
[2833] Fresh Perl Teaching Examples - part 2 of 3 - (2010-06-27)
[2876] Different perl examples - some corners I rarely explore - (2010-07-18)
[2972] Some more advanced Perl examples from a recent course - (2010-09-27)
[3449] Apache Internal Dummy Connection - what is it and what should I do with it? - (2011-09-19)
[4301] Perl - still a very effective language indeed for extracting and reporting - (2014-09-20)
[4395] Preparing data through a little bit of Perl - (2015-01-15)
[4682] One line scripts - Awk, Perl and Ruby - (2016-05-20)
[4700] Obfurscated code - it might work, but is it maintainable? - (2016-07-02)
P209 - Subroutines in Perl [96] Variable Scope - (2004-10-22)
[308] Call by name v call by value - (2005-05-11)
[357] Where do Perl modules load from - (2005-06-24)
[531] Packages in packages in Perl - (2005-12-16)
[588] Changing @INC - where Perl loads its modules - (2006-02-02)
[775] Do not duplicate your code - (2006-06-23)
[1163] A better alternative to cutting and pasting code - (2007-04-26)
[1202] Returning multiple values from a function (Perl, PHP, Python) - (2007-05-24)
[1782] Calling procs in Tcl and how it compares to Perl - (2008-09-02)
[1784] Global - Tcl, PHP, Python - (2008-09-03)
[1826] Perl - Subs, Chop v Chomp, => v , - (2008-10-08)
[1850] Daisy the Cow and a Pint of Ginger Beer - (2008-10-21)
[1921] Romeo and Julie - (2008-12-04)
[2069] Efficient calls to subs in Perl - avoid duplication, gain speed - (2009-03-07)
[2550] Do not copy and paste code - there are much better ways - (2009-12-26)
[2929] Passing a variable number of parameters in to a function / method - (2010-08-20)
[3066] Separating groups of variables into namespaces - (2010-11-24)
[3574] Perl functions such as chop change their input parameters - (2012-01-10)
[3833] Learning to use existing classes in Perl - (2012-08-10)
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