1

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

2 回答 2

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::Diverautovivificationpragma,它们可以防止自动存活。

于 2013-08-06T17:30:35.140 回答
2
$Hash{'ABC'}{'Status'}

简称

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

你所拥有的是一个取消引用。当取消引用的变量未定义时,自动激活会启动以创建适当类型的变量。这使得上述等价于

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

您可以通过避免取消引用未定义的内容来避免自动激活

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

或者你可以使用no autovivification;

no autovivification;
if (defined $Hash{'ABC'}{'Status'})
于 2013-08-06T17:45:08.080 回答