首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用子例程时perl自动生动化

调用子例程时perl自动生动化
EN

Stack Overflow用户
提问于 2019-02-05 18:27:53
回答 1查看 96关注 0票数 4

为什么在调用过程中自动生动化不起作用?在这种情况下也有办法禁止吗?

代码语言:javascript
复制
#!/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 = {}; 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-05 18:38:01

代码语言:javascript
复制
my $task
print Dumper($task)

此时,perl不知道要自动生成什么。它将$task的LVALUE引用传递给Dumper,Dumper对该引用不做任何操作,因此不会发生任何事情。

代码语言:javascript
复制
my $a = $task->{parent_id}

因为这是一个副本,所以它被视为一个RVALUE。因此,不需要生动化。

代码语言:javascript
复制
my $b = testsub($task->{parent_id})

要正确地使用LVALUE引用填充@_,perl现在必须创建哈希,以便它能够正确地传递引用。

为了避免这样做,您可以传入对$task的引用,然后在必要时在内部访问parent_id

代码语言:javascript
复制
sub testsub { my $task_ref = shift; if (something) { $$task_ref->{parent_id} = 3 } }
my $b = testsub(\$task);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54540811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档