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} ) { ... }
下面是示例代码。:
#!/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} ) { ... }