use strict; my @array = ( ); foreach ( ['initially empty', sub { }], [' undef as first', sub { @array = undef }], [' emptied', sub { @array = ( ) }], [' undefed', sub { undef @array }], [' emptied again', sub { @array = ( ) }], ) { my($name,$change) = @$_; $change->(); printf "%15s: %-5s %-9s\n", $name, ( @array ? 'true' : 'false' ), ( defined(@array) ? 'defined' : 'undefined' ); } __END__ initially empty: false undefined undef as first: true defined *********** emptied: false defined <-- ** HUH?! ** undefed: false undefined *********** emptied again: false undefined #### defined(@array) is deprecated (Maybe you should just omit the defined()?)