2013-08-06 42 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'})