diff options
author | David Golden <dagolden@cpan.org> | 2010-09-12 20:26:43 -0400 |
---|---|---|
committer | David Golden <dagolden@cpan.org> | 2010-10-21 09:23:58 -0400 |
commit | c035a075a240f10383292128a8d3f3746c4ac857 (patch) | |
tree | a245d8f117b9636fe740448118a753e5457978c8 /op.c | |
parent | 9061a8f72941979d02cbccb5cb18a2034813b6a7 (diff) | |
download | perl-c035a075a240f10383292128a8d3f3746c4ac857.tar.gz |
Add single-term prototype
The C<+> prototype is a special alternative to C<$> that will act like
C<\[@%]> when given a literal array or hash variable, but will otherwise
force scalar context on the argument. This is useful for functions which
should accept either a literal array or an array reference as the argument:
sub smartpush (+@) {
my $aref = shift;
die "Not an array or arrayref" unless ref $aref eq 'ARRAY';
push @$aref, @_;
}
When using the C<+> prototype, your function must check that the argument
is of an acceptable type.
Diffstat (limited to 'op.c')
-rw-r--r-- | op.c | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -8735,6 +8735,18 @@ Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv) } scalar(aop); break; + case '+': + proto++; + arg++; + if (o3->op_type == OP_RV2AV || + o3->op_type == OP_PADAV || + o3->op_type == OP_RV2HV || + o3->op_type == OP_PADHV + ) { + goto wrapref; + } + scalar(aop); + break; case '[': case ']': goto oops; break; |