=over =item defined EXPR X X X =item defined Returns a Boolean value telling whether EXPR has a value other than the undefined value L|/undef EXPR>. If EXPR is not present, L|perlvar/$_> is checked. Many operations return L|/undef EXPR> to indicate failure, end of file, system error, uninitialized variable, and other exceptional conditions. This function allows you to distinguish L|/undef EXPR> from other values. (A simple Boolean test will not distinguish among L|/undef EXPR>, zero, the empty string, and C<"0">, which are all equally false.) Note that since L|/undef EXPR> is a valid scalar, its presence doesn't I indicate an exceptional condition: L|/pop ARRAY> returns L|/undef EXPR> when its argument is an empty array, I when the element to return happens to be L|/undef EXPR>. You may also use C to check whether subroutine C has ever been defined. The return value is unaffected by any forward declarations of C. A subroutine that is not defined may still be callable: its package may have an C method that makes it spring into existence the first time that it is called; see L. Use of L|/defined EXPR> on aggregates (hashes and arrays) is no longer supported. It used to report whether memory for that aggregate had ever been allocated. You should instead use a simple test for size: if (@an_array) { print "has array elements\n" } if (%a_hash) { print "has hash members\n" } When used on a hash element, it tells you whether the value is defined, not whether the key exists in the hash. Use L|/exists EXPR> for the latter purpose. Examples: print if defined $switch{D}; print "$val\n" while defined($val = pop(@ary)); die "Can't readlink $sym: $!" unless defined($value = readlink $sym); sub foo { defined &$bar ? $bar->(@_) : die "No bar"; } $debugging = 0 unless defined $debugging; Note: Many folks tend to overuse L|/defined EXPR> and are then surprised to discover that the number C<0> and C<""> (the zero-length string) are, in fact, defined values. For example, if you say "ab" =~ /a(.*)b/; The pattern match succeeds and C<$1> is defined, although it matched "nothing". It didn't really fail to match anything. Rather, it matched something that happened to be zero characters long. This is all very above-board and honest. When a function returns an undefined value, it's an admission that it couldn't give you an honest answer. So you should use L|/defined EXPR> only when questioning the integrity of what you're trying to do. At other times, a simple comparison to C<0> or C<""> is what you want. See also L|/undef EXPR>, L|/exists EXPR>, L|/ref EXPR>. =back