NAME
Perl6::Parameters – Perl 6-style prototypes with named parameters
SYNOPSIS
use Perl6::Parameters;
sub mysub($foo, ARRAY $bar, *%rest) {
...
}
DETAILS
Perl6::Parameters is a Perl module which simulates Perl 6's named parameters. (When I talk about "named parameters" I mean something like the parameters you're used to from C, Java and many other languages--not pass-a-hash-with-the-parameters-in-it things.)
Like most other programming languages, Perl 6 will support subroutines with pre-declared variables the parameters are put into. (Using this will be optional, however.) This goes far beyond the "line-noise prototypes" available in Perl 5, which only allow you to control context and automatically take references to some parameters--lines like my($first, $second)=(@_)
will no longer be necessary.
Although Perl 6 will have this, Perl 5 doesn't; this module makes it so that Perl 5 does. It uses some other Perl 6-isms too, notably the names for builtin types and the unary-asterisk notation for flattening a list.
Crafting Parameter Lists
Crafting parameter lists is simple; just declare your subroutine and put the parameters separated by commas or semicolons, in parenthesis. (Using a semicolon signifies that all remaining parameters are optional; this may not be available this way in Perl 6, but I'm assuming it is until I hear otherwise.)
Most parameters are just variable names like $foo
; however, more sophisticated behavior is possible. There are three ways to achieve this.
The first way is by specifying a type for the variable. Certain types make the actual parameters turn into references to themselves:
ARRAY $foo
This turns an array into a reference to itself and stores the reference into
$foo
.HASH $foo
This turns a hash into a reference to itself and stores the reference into
$foo
.CODE $foo
This turns a subroutine into a reference to itself and stores the reference into
$foo
.SCALAR $foo
This turns a scalar into a reference to itself and stores the reference into
$foo
.GLOB $foo
This turns a typeglob into a reference to itself and stores the reference into
$foo
. Typeglobs will be going away in Perl 6; this type exists in this module so that it's useful for general use in Perl 5.REF $foo
This turns any parameter into a reference to itself and stores it into
$foo
.This only works in Perl 5.8. Otherwise, it's treated the same as any other unrecognized type name.
AnythingElse $foo
This has no effect in this module; it's treated as though you'd typed
$foo
without theAnythingElse
.
For example, if a subroutine had the parameters ($foo, HASH $bar, CODE $baz)
and was called with ($scalar, %hash, &mysub)
the subroutine would get the contents of $scalar
, a reference to %hash
and a reference to &mysub
.
The second way is by supplying an actual array or hash as a parameter name. This requires an array or hash to be passed in for that parameter; it preserves the length of the array or hash.
The final way is only available for the last parameter: if an array or hash is prefixed with an asterisk, that array or hash will be filled with any additional parameters.
CAVEATS
In Perl 6, parameters will be passed by constant reference; in this module parameters are passed by value.
In Perl 6, putting an
is rw
at the end of a parameter will make it read-write; trying to useis rw
with this module will cause an error.@_
and%_
may only be used for the last parameter, and then only when prefixed by an asterisk; any other use causes undefined behavior.In Perl 6 a definition like
HASH $foo
will take either a literal hash (with a%
sign in front of it) or a reference to a hash; this module requires a%
sign. (Similar limitations apply for arrays.)
BUGS
None known--but if you find any, send them to <bug-Perl6-Parameters@rt.cpan.org> and CC <brentdax@cpan.org>.
AUTHOR
Brent Dax <brentdax1@earthlink.net>
COPYRIGHT
Copyright (C) 2001 Brent Dax.
This module is free software and may be used, redistributed and modified under the same terms as Perl itself.
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 173:
Non-ASCII character seen before =encoding in '–'. Assuming CP1252