Perl Subroutines

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.

\$
single scalar parameter
\@
single list
\%
single hash
*
bareword, constant, scalar expression, typeglob, or a reference to a typeglob. The value will be available to the subroutine either as a simple scalar, or (in the latter two cases) as a reference to the typeglob. If you wish to always convert such arguments to a typeglob reference, use Symbol::qualify_to_ref()
&
requires an anonymous subroutine, which, if passed as the first argument, does not require the sub keyword or a subsequent comma. eg ( {statements;} )
$
converts the parameter to scalar context
@
provides all the remaining parameters as a list
%
provides all the remaining parameters as a hash
; (semicolon)
separates mandatory arguments from optional arguments. It is redundant before @ or %

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".