sub [ name ] [ (prototype) ] [ : attributes ] [ {statements;} ]
sub name [
(prototype) ]
Forward declaration. The actual subroutine will be defined later but this
allows us to refer to it now. The prototype is optional.
sub [ name ]
{statements;}
Normal subroutine definition. Any number of scalar arameters can be passed
to the subroutine and will show up in @_. Note that name IS optional. A function
can return a sub or a sub can be passed as a parameter. e.g. return sub
{ $_ += 1; };
sub name
(prototype) {statements;}
The prototype string helps to specify what this subroutine needs to recieve
in the way of parameters.
Parameters are passed to the subroutine as scalars in @_ and returned as list, scalar, or void.
The return value of a subroutine is the value of the last expression evaluated. More explicitly, a return statement may be used to exit the subroutine, optionally specifying the returned value
The interesting thing about & is that you can generate new syntax with it, provided it's in the initial position: sub try (&@) { my($try,$catch) = @_; eval { &$try }; if ($@) { local $_ = $@; &$catch; } } sub catch (&) { $_[0] } try { die "phooey"; } catch { /phooey/ and print "unphooey\n"; }; That prints "unphooey".