[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]
exists does not autovivify
>Speaking for weirdness, is anyone else concerned with the autovivication
>of intermediate steps of exists()? My expectation has always been that
>exists() does not autovivify. Once the behavior is documented, then it
>will be more difficult to fix later.
It *is* already documented.
% man 3p exists
...
Note that the EXPR can be arbitrarily complicated as long as
the final operation is a hash key lookup:
if (exists $ref->{A}->{B}->{$key}) { }
if (exists $hash{A}{B}{$key}) { }
Although the last element will not spring into existence just
because its existence was tested, intervening ones will. Thus
`$ref->{"A"}' and `$ref->{"A"}->{"B"}' will spring into existence
due to the existence test for a $key element. This happens
anywhere the arrow operator is used, including even
undef $ref;
if (exists $ref->{"Some key"}) { }
print $ref; # prints HASH(0x80d3d5c)
This surprising autovivification in what does not at first--or
even second--glance appear to be an lvalue context may be fixed
in a future release.
It's not "exists" that is autovivifying. I can come up with as
many more scores of examples as you'd like, all using other functions
that exists().
do {
say "exists() does not autovivify"
} until you believe me;
It's the use of the derefencing operation that does this. And how about
this:
undef @x;
print if $x[100][100];
print $x[100];
I hope you aren't to curse the if() statement now. :-)
--tom
- Follow-Ups from:
-
Joshua N Pritikin <joshua.pritikin@db.com>
[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]