in reply to why can't compare a variable with undef directly?

undef is rather like NULL in a database context ... it is "the absence of a value." Any value. Comparison to nothing-at-all has no meaning. But it is valid to test for exists($a) == exists($b), which is True if both are defined or if neither one is.
  • Comment on Re: why can't compare a variable with undef directly?

Replies are listed 'Best First'.
Re^2: why can't compare a variable with undef directly?
by Mr. Muskrat (Canon) on Dec 10, 2014 at 16:14 UTC

    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.

      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 { ...; }

        Your response makes no sense to me since I was responding to AM's usage of exists with a scalar not a hash or array element.

      Oops ... defined(), obviously. duh.