以下代码打印Key defined 3
。
为什么Perl定义了键ABC
?我期待所有三项检查都是假的。我做错了什么?
#!/usr/bin/perl
use warnings;
use strict;
my %Hash;
if(defined $Hash{'ABC'})
{
printf("Key defined 1\n");
}
if(defined $Hash{'ABC'}{'Status'})
{
printf("Key defined 2\n");
}
if(defined $Hash{'ABC'})
{
printf("Key defined 3\n");
}
答案 0 :(得分:4)
此$Hash{'ABC'}{'Status'}
自动归档ABC密钥(请参阅perldoc perlref和wikipedia):
use warnings;
use strict;
use Data::Dumper;
my %Hash;
if(defined $Hash{'ABC'})
{
printf("Key defined 1\n");
}
print Dumper(\%Hash);
if(defined $Hash{'ABC'}{'Status'})
{
printf("Key defined 2\n");
}
print Dumper(\%Hash);
if(defined $Hash{'ABC'})
{
printf("Key defined 3\n");
}
print Dumper(\%Hash);
__END__
$VAR1 = {};
$VAR1 = {
'ABC' => {}
};
Key defined 3
$VAR1 = {
'ABC' => {}
};
另请参阅Data::Diver和autovivification
pragma,以防止自动生成。
答案 1 :(得分:2)
$Hash{'ABC'}{'Status'}
是
的缩写$Hash{'ABC'}->{'Status'}
你所拥有的是一个解除引用。当取消引用的变量未定义时,autovivification将启动以创建适当类型的变量。这使得上述内容等同于
( $Hash{'ABC'} //= {} )->{'Status'}
您可以通过避免取消引用未定义的内容来避免自动生成
if ($Hash{'ABC'} && defined $Hash{'ABC'}{'Status'})
或者您可以使用no autovivification;
no autovivification;
if (defined $Hash{'ABC'}{'Status'})