首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于任务的Perl自动生动化

基于任务的Perl自动生动化
EN

Stack Overflow用户
提问于 2017-03-01 12:53:22
回答 2查看 252关注 0票数 0

当不存在的键被分配给一个变量时,Perl真正的自动激活键吗?

我有这样的代码:

my $variable = $self->{database}->{'my_key'}[0];

变量$self->{database}->{'my_key'}[0]在我的哈希中没有定义,但是如果我在赋值之后打印一个Dumper,那么我很惊讶my_key是创建的。

我知道这种情况的功能:

代码语言:javascript
复制
use Data::Dumper;

my $array;

$array->[3] = 'Buster';  # autovivification
print Dumper( $array );

这将给我的结果:

$VAR1 = [ undef, undef, undef, 'Buster' ];

但从未想过会以相反的方式工作,在那里:my $weird_autovivification = $array->[3];也会使$array->[3]生动起来。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-01 14:38:29

当不存在的键被分配给一个变量时,Perl真正的自动激活键吗?

Perl在解除引用变量(包括数组元素和哈希值)时会自动生动化它们。

代码语言:javascript
复制
$foo->{bar}   [ $foo dereferenced as a hash   ]    ≡    ( $foo //= {} )->{bar}
$foo->[3]     [ $foo dereferenced as an array ]    ≡    ( $foo //= [] )->[3]
$$foo         [ $foo dereferenced as a scalar ]    ≡    ${ $foo //= do { my \$anon } }
etc

这意味着

代码语言:javascript
复制
$self->{database}->{'my_key'}[0]

自动形象化

  • $self (如果未定义,则为散列引用)
  • $self->{database} (如果未定义,则为散列引用)
  • $self->{database}->{'my_key'} (如果未定义为数组参考)

但不是

  • $self->{database}->{'my_key'}[0] (因为它没有被取消引用)

但从未想过会以相反的方式工作,比如:my $weird_autovivification = $array->[3];也会使$array->[3]__生动活泼。

不完全是。它自动生成$array,该变量被取消引用。没有分配给$array->[3],因为它没有被取消引用。

提示:自生化实用程序可以用于控制自动生动化发生的时间。

票数 7
EN

Stack Overflow用户

发布于 2017-03-01 13:49:35

但从未想过会以相反的方式工作,在那里:my $weird_autovivification = $array->[3];也将生动地呈现出$array[3]

它不是这样工作的。

代码语言:javascript
复制
$ perl -MData::Dumper -E'$foo=$array->[3]; say Dumper $array'
$VAR1 = [];

执行该代码已经将$array转换为数组引用(在此之前,它可能是未定义的),但它没有将$array->[3]设置为任何东西。

如果我们再加一个级别的查找,我们的行为就会略有不同:

代码语言:javascript
复制
$ perl -MData::Dumper -E'$foo=$array->[0][3]; say Dumper $array'
$VAR1 = [
          []
        ];

在这里,Perl已经创建了$array->[0]并将其设置为对空数组的引用,但它没有影响$array->[0][3]

通常,当您在一个复杂的数据结构中进行一系列查找时,Perl将自动将链中的最后一个环节之外的所有内容都自动显示出来。当你想起来的时候,这是很有道理的。Perl需要自动激活链中的一个链接,以便检查下一个链接是否存在。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42532298

复制
相关文章

相似问题

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