[Israel.pm] function prototypes
Yitzchak Scott-Thoennes
sthoenna at efn.org
Wed Jun 11 08:19:42 EEST 2008
On Tue, June 10, 2008 1:25 pm, Shmuel Fomberg wrote:
> I'm trying to write a function:
> sub MetaField ($&) { ... }
>
> and call it like that: MetaField("data", { $_->ctx->{length} })
> or:
> MetaField("data", $_->ctx->{length})
>
> but only this works: MetaField("data", sub { $_->ctx->{length} })
The "sub" is only optional if the prototype starts with &. From perlsub:
An "&" requires an anonymous subroutine, which, if passed as the first
argument, does not require the "sub" keyword or a subsequent comma.
I'm not sure how perl would know you meant the second example to be
a sub that returns $_->ctx->{length} (based on whatever $_ is set to
if and when MetaField ends up calling the sub), which is what the
third does.
If you somehow meant that $_->ctx->{length} is itself the coderef
you want to pass, there isn't a convenient way to do that, since
"&" explictly expects a new anonymous sub.
I suggest reconsidering using prototypes at all.
More information about the Perl
mailing list