$ cat t.pl use strict; use warnings; my $data = { FOO=>{HOST=>undef, BANG=>3}}; for my $K (qw(HOST BANG GONE)) { print "$K exists\n" if exists $data->{FOO}{$K}; print "$K defined\n" if defined $data->{FOO}{$K}; print "$K val==''\n" if $data->{FOO}{$K} eq ""; } $ perl t.pl HOST exists Use of uninitialized value in string eq at t.pl line 9. HOST val=='' BANG exists BANG defined Use of uninitialized value in string eq at t.pl line 9. GONE val==''