如何在Perl中进行非分化

如何在Perl中进行非分化,perl,autovivification,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 $

假设我有一个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;
但我的输出会自动创建“c”,这是我不想要的

defined a
undef b
undef c
$VAR1 = {
      'c' => {},
      'a' => {
               'aa' => 'b'
             },
      'b' => {}
    };

此外,我的发行版不允许我禁用自生功能。有没有办法制作一个检查每个级别的子程序?

在所需范围内调用
无自动激活

for (qw(a b c)) {
    no autovivification;
    if(defined $hash->{$_}->{aa})
    {
        say "defined $_";
    }
    else
    {
        say "undef $_";
    }
}
如果
autovivification
pragma不可用,通常的习惯用法是在运行更深层次的检查之前测试顶层散列是否存在:

if ($hash && $hash->{$_} && defined($hash->{$_}->{aa}) {
   ...
}

这里有一个简单的函数,它检查每个级别是否存在,并在不自动激活中间级别的情况下停止。原型是不必要的;它使它的行为(有点)像内置的
定义的
。此版本仅适用于嵌套哈希(除了祝福哈希和看起来像哈希的重载对象)

问题是:

if (exists $hash->{$_} and defined $hash->{$_}->{aa})

我将如何以编程方式实现这一点?如中所示,如果我调用
noVivDefined($hash->{$\u}->{aa};
@ericfosum:您将调用函数作为
noVivDefined($hashref,@keys)
。它会在键上循环,并在每个级别执行
定义的
检查。@Eric Fossum,你的意思是它不能安装?那会很奇怪。
noVivDefined
已经存在,如s
Dive
。哈哈!奇怪!没有输入错误,但cpan无法使用我使用的正常URL找到它。无论如何,更新了链接。我个人会返回一个参考对元素的引用。这样,您就不需要第二次跳转来处理您发现的已定义的值了。
my$ref=dive\%h,@k;if($ref&&defined$$ref){say$$ref;}否则{say“[unde]”}
这不是很有程序性……如果我想写出所有内容,我就不会使用循环。添加一个表达式(~24个字符)使整个示例变得“不实用”,并导致您“写出所有内容”和“挫败循环的目的”?这是荒谬的夸张。请提供一个真实的示例,说明问题所在。。。
if (exists $hash->{$_} and defined $hash->{$_}->{aa})