Semantics
Before you get too worked up over all that syntax, just remember that the normal way to define a simple subroutine ends up looking like this:
sub razzle { print "Ok, you've been razzled.\n"; }
and the normal way to call it is simply:
razzle();
In this case, we ignored inputs (arguments) and outputs
(return values). But the Perl model for passing data into and out of a
subroutine is really quite simple: all function parameters are passed
as one single, flat list of scalars, and multiple return values are
likewise returned to the caller as one single, flat list of scalars.
As with any LIST
, any arrays or hashes
passed in these lists will interpolate their values into the flattened
list, losing their identities--but there are several ways to get
around this, and the automatic list interpolation is frequently quite
useful. Both parameter lists and return lists may contain as many or
as few scalar elements as you'd like (though you may put constraints
on the parameter list by using prototypes). Indeed, Perl is designed
around this notion of variadic functions (those
taking any number of arguments), unlike C, where they're sort of
grudgingly kludged in so that you can call printf
(3).
Now, if you're going to design a language around the
notion of passing varying numbers of arbitrary arguments, you'd better
make it easy to process those arbitrary lists of arguments. Any
arguments passed to a Perl routine come in as the array
@_
. If you call a function with two arguments, they ...
Get Programming Perl, 3rd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.