Perl定义未定义的键

时间:2013-08-06 17:25:23

标签: perl hash key undefined autovivification

以下代码打印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");
}

2 个答案:

答案 0 :(得分:4)

$Hash{'ABC'}{'Status'}自动归档ABC密钥(请参阅perldoc perlrefwikipedia):

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::Diverautovivification 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'})