调用子程序时的 perl 自动生成

perl autovivification when calling subroutine

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

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