为什么调用程序时自动复活不起作用?在这种情况下也有办法禁止它吗?
#!/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 = {};
答案 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);