调用子例程时进行perl自动生存

时间:2019-02-05 18:27:53

标签: perl autovivification

为什么调用程序时自动复活不起作用?在这种情况下也有办法禁止它吗?

#!/usr/bin/env perl
no autovivification;
use Data::Dumper;

sub testsub { }

my $task;
print Dumper($task);    # $VAR1 = undef;
my $a = $task->{parent_id};
print Dumper($task);    # $VAR1 = undef;
my $b = testsub($task->{parent_id});
print Dumper($task);    # $VAR1 = {}; 

1 个答案:

答案 0 :(得分:5)

my $task
print Dumper($task)

在这一点上,perl不知道该如何生存。它将$ task的LVALUE引用传递给Dumper,该引用不执行任何操作,因此没有任何反应

my $a = $task->{parent_id}

由于这是一个副本,因此被视为RVALUE。因此不需要任何动感。

my $b = testsub($task->{parent_id})

要使用LVALUE引用正确填充@_,perl现在必须创建散列,以便它可以正确传递引用。

为避免这样做,您可以传递对$task的引用,然后在必要时访问内部的parent_id

sub testsub { my $task_ref = shift; if (something) { $$task_ref->{parent_id} = 3 } }
my $b = testsub(\$task);