автовификация perl при вызове подпрограммы - PullRequest
0 голосов
/ 05 февраля 2019

Почему авто-вивификация не работает при вызове процедур?Есть ли способ запретить это и в этом случае?

#!/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 голосов
/ 05 февраля 2019
my $task
print Dumper($task)

На данный момент, Perl не знает, что делать автовивификации.Он передает ссылку LVALUE $ task в 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);
...