2013-08-06 38 views
1

以下代码打印Key defined 3。 为什么Perl定义了密钥ABC?我期待所有的三张支票都是假的。我做错了什么?定义未定义键的Perl

#!/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"); 
} 

回答

4

$Hash{'ABC'}{'Status'} autovivifies 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,这防止自动激活。

2
$Hash{'ABC'}{'Status'} 

是短期的

$Hash{'ABC'}->{'Status'} 

你有什么是间接引用。当取消引用的变量未定义时,autovivification会启动以创建适当类型的变量。这避免了非关联化的东西不确定

if ($Hash{'ABC'} && defined $Hash{'ABC'}{'Status'}) 

或者使上述相当于

($Hash{'ABC'} //= {})->{'Status'} 

你能避免自动激活就可以使用no autovivification;

no autovivification; 
if (defined $Hash{'ABC'}{'Status'})