Actually that is invalid because exists doesn't operate on scalars.
exists argument is not a HASH or ARRAY element or a subroutine at ...
The valid equivalent of that is defined $a && defined $b but don't use $a and $b outside of a sort.
| [reply] [d/l] |
Actually, exists tests if the element is present. Even if the element exists, the value of the element could still be undef.
Note that defined($array[$i]) will cause the element at index $i to be created. Likewise, defined($array{$k}) will create an element referred by key $k. In both cases, the new element with have the value undef.
This "auto-vivification" may have undesirable side effects. This is most likely to become a problem where a hash is being used to hold options or named parameters. Often times, the absence of an option or parameter has a different meaning than when present with no value specified (ie, value is undef).
When in doubt, it is generally better to test for existence then for a defined value:
if (exists $params{'foo'}) {
if (defined $params{'foo'}) {
...;
} else {
...;
}
} else {
...;
}
| [reply] [d/l] [select] |
| [reply] |
Oops ... defined(), obviously. duh.
| [reply] |