Perl Hash 在访问它的未定义值时被错误地初始化

Perl Hash is initialised incorrectly when accessing it's undefined value

下面是示例代码。:

#!/usr/bin/perl
use Data::Dumper;
my $var=undef;
warn Dumper($var);
if ( $var->{CHECK}->{CHOKE} )
{
    print "Success\n";
}
else
{
    print "Failure\n";
}
warn Dumper($var);

输出:

$VAR1 = undef;
Failure
$VAR1 = {
          'CHECK' => {}
        };

最初,$var 未定义。在 if 子句中, 我正在尝试通过 {CHECK} 通过 $var.

访问 {CHOKE} 的值

if 循环按预期正确失败。但是现在 $var 的值包含 {CHECK}.

的值(尽管它为空)

这是 Perl 中的错误吗?如果这是预期的行为,请帮助我理解这种行为。

这不是错误,它是一个名为 autovivification 的功能,它会在您尝试访问更高级别时自动创建数据结构的子级别。

所以当你这样做时

if ( $var->{CHECK}->{CHOKE} )

然后 $var->{CHECK} 创建。

自动生成功能意味着

$x->{y}

实际上等同于

( $x //= {} )->{y}

$x 为 undef 并且您将其视为哈希引用时,将创建一个哈希并将对哈希的引用分配给 $x

使用 no autovivification; 将减少这种行为。

其他人已经表明这是预期的自动激活行为。如果你不想这样,你可以关闭那个功能,但你也可以在深入之前使用守卫检查密钥:

if( exists $var->{CHECK} ) { ... }

您甚至可以将它们结合起来:

if( exists $var->{CHECK} and exists $var->{CHECK}{CHOKE} ) { ... }