In article <m13dkhukfy.fsf@rt158.private.realtime.co.uk>, Piers Cawley <pdcawley@bofh.org.uk> wrote: > > sub my_substr ( $$;$$ ) : lvalue { > my $retval; > tie $retval, 'Lval', \ $_[0], @_[1,2] or die; > $retval = $_[3] if exists $_[3]; Thats a cute way of checking if a parameter was passed, but doesn't work in all cases. Internally, exists on an array element (a new feature with 5.6.0, for those who are wondering) just checks if the scalar value pointer is to the special global undef value. Thus it will not always work, since sometimes an undef value that is pass in will also actually be the global undef value. For instance: #!perl -w sub e { print(scalar @_, " parameter(s) passed. Parameter 0 ", exists $_[0] ? "exists!\n" : "Doesn't exist!\n") } e(undef); # a value passed but exists is false e($_) for undef; # also through an alias sub ee { e(@_) } ee(undef); # including an alias through @_ The moral: if you want to check if a parameter is defined, use defined(). If you want to check if a parameter was passed, use scalar(@_). ==== Want to unsubscribe from Fun With Perl? Well, if you insist... ==== Send email to <fwp-request@technofile.org> with message _body_ ==== unsubscribe