To avoid the dangerous practice of copying and pasting code throughout a program, your larger programs will probably reuse chunks of code with subroutines. We'll use the terms
subroutine
and
function
interchangeably, because Perl doesn't distinguish between the two any more than C does. Even object-oriented methods are just subroutines that are called using a special syntax, described in
Chapter 13,
Classes, Objects, and Ties
.
A subroutine is declared with the
sub
keyword. Here's a simple subroutine definition:
sub hello {
$greeted++; # global variable
print "hi there!\n";
}
The typical way of calling that subroutine is:
hello(); # call subroutine hello with no arguments/parameters
Because Perl compiles your program before executing it, it doesn't matter where your subroutines are declared. These definitions don't have to be in the same file as your main program. They can be pulled in from other files using the
do
,
require
, or
use
operators, as described in
Chapter 12,
Packages, Libraries, and Modules
. They can even be created on the fly using
eval
or the AUTOLOAD mechanism, or generated using closures, which can be used as function templates.
If you are familiar with other programming languages, several characteristics of Perl's functions may surprise you if you're not prepared. Most of the recipes in this chapter illustrate how to take advantage of - and be aware of - these properties.
-
Perl functions have no formal, named parameters, but this is not necessarily a bad thing. See Recipes
10.1
and
10.7
.
-
All variables are global unless declared otherwise. See Recipes
10.2
,
10.3
, and
10.13
for details.
-
Passing or returning more than one array or hash normally causes them to lose their separate identities. See Recipes
10.5
,
10.8
,
10.9
, and
10.11
to avoid this.
-
A function can know whether it was called in list or scalar context, how many arguments it was called with, and even the name of the function that called it. See Recipes
10.4
and
10.6
to find out how.
-
Perl's
undef
value can be used to indicate an error condition since no valid string or number ever has that value.
10.10
covers subtle pitfalls with
undef
you should avoid, and
10.12
shows how to deal with other catastrophic conditions.
-
Perl supports interesting operations on functions you might not see in other languages, like anonymous functions, creating functions on the fly, and calling them indirectly using function pointers. See Recipes
10.14
and
10.16
for these esoteric topics.
Calling a function as
$x
=
&func;
does not supply any arguments, but rather provides direct access to its caller's
@_
array! If you omit the ampersand and use either
func()
or
func
, then a new and empty
@_
is provided instead.