4

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

#!/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 = {}; 
4

1 回答 1

5
my $task
print Dumper($task)

在这一点上,perl 不知道要自动激活什么。它将 $task 的 LVALUE 引用传递给 Dumper,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);
于 2019-02-05T18:38:01.913 回答