如何在Perl中进行非证书

Eri*_*sum 2 perl autovivification

假设我有一个Perl脚本:

my $hash = {};
$hash->{'a'} = {aa => 'b'};
$hash->{'b'} = undef;

for (qw(a b c)) {
    if(defined $hash->{$_}->{aa})
    {
        say "defined $_";
    }
    else
    {
        say "undef $_";
    }
}
print Dumper $hash;
Run Code Online (Sandbox Code Playgroud)

但是我的输出会自动创建'c',这是我不想要的.

defined a
undef b
undef c
$VAR1 = {
      'c' => {},
      'a' => {
               'aa' => 'b'
             },
      'b' => {}
    };
Run Code Online (Sandbox Code Playgroud)

我的发行版也不允许我禁用自动修复.有没有办法制作一个检查每个级别的子程序?

mob*_*mob 11

呼叫no autovivification所需范围:

for (qw(a b c)) {
    no autovivification;
    if(defined $hash->{$_}->{aa})
    {
        say "defined $_";
    }
    else
    {
        say "undef $_";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果autovivificationpragma不可用,通常的习惯用法是在更深层次运行检查之前测试是否存在顶级哈希:

if ($hash && $hash->{$_} && defined($hash->{$_}->{aa}) {
   ...
}
Run Code Online (Sandbox Code Playgroud)