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.
_______________________________________________
Perl mailing list
[email protected]
http://perl.org.il/mailman/listinfo/perl