use strict; use warnings; use feature 'say';
use Data::Dumper; $Data::Dumper::Sortkeys = $Data::Dumper::Indent = 1;
my $href = {
cat => { milk => 1 },
dog => { bone => 1 },
};
say exists $href->{'cow'}->{'alfalfa'} ? 'cow' : 'no cow';
say Dumper $href
__END__
Output:
no cow
$VAR1 = {
'cat' => {
'milk' => 1
},
'cow' => {}, # uh-oh
'dog' => {
'bone' => 1
}
};
So you would have to either use exists on all levels of the structure as haukex suggested:
use strict; use warnings; use feature 'say';
use Data::Dumper; $Data::Dumper::Sortkeys = $Data::Dumper::Indent = 1;
my $href = {
cat => { milk => 1 },
dog => { bone => 1 },
};
say exists $href->{'cow'} &&
exists $href->{'cow'}->{'alfalfa'} ? 'cow' : 'no cow';
say Dumper $href
__END__
Output:
no cow
$VAR1 = {
'cat' => {
'milk' => 1
},
'dog' => {
'bone' => 1
}
};
... or use autovivification:
use strict; use warnings; use feature 'say';
use Data::Dumper; $Data::Dumper::Sortkeys = $Data::Dumper::Indent = 1;
my $href = {
cat => { milk => 1 },
dog => { bone => 1 },
};
no autovivification;
say exists $href->{'cow'}->{'alfalfa'} ? 'cow' : 'no cow';
say Dumper $href
__END__
Output:
no cow
$VAR1 = {
'cat' => {
'milk' => 1
},
'dog' => {
'bone' => 1
}
};
Note that autovivification.pm has effect lexically:
use strict; use warnings; use feature 'say';
use Data::Dumper; $Data::Dumper::Sortkeys = $Data::Dumper::Indent = 1;
my $href = {
cat => { milk => 1 },
dog => { bone => 1 },
};
{
no autovivification;
say exists $href->{'cow'}->{'alfalfa'} ? 'cow' : 'no cow';
say Dumper $href
}
say exists $href->{'cow'}->{'alfalfa'} ? 'cow' : 'still no cow';
say Dumper $href;
__END__
no cow
$VAR1 = {
'cat' => {
'milk' => 1
},
'dog' => {
'bone' => 1
}
};
still no cow
$VAR1 = {
'cat' => {
'milk' => 1
},
'cow' => {}, # uh-oh
'dog' => {
'bone' => 1
}
};
The way forward always starts with a minimal test.
|