调用子程序时的 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);
为什么调用程序时自动激活不起作用?在这种情况下有没有办法禁止它?
#!/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);