为什么undef值在Perl中成为有效的数组引用?

时间:2009-10-29 13:24:35

标签: perl

在perl 5.8.5中,如果我执行以下操作,则不会出现错误:

use strict;

my $a = undef;
foreach my $el (@$a) {
  ...whatever
}

这里发生了什么?打印出ref($a)的输出表明$a更改为在某个时刻成为有效的数组引用。但我从未明确地将$a设置为任何内容。

如果没有我做任何事情,变量的内容可能会改变,这似乎有些奇怪。

思考,有人吗?

编辑:是的,我知道所有关于自动生存的知识。我一直认为必须在某个地方有一个任务来触发它,而不仅仅是一个参考。

2 个答案:

答案 0 :(得分:15)

Auto-vivification就是这个词。从链接:

  

自动生成是Perl编程的一个显着特征   涉及动态的语言   创建数据结构。   自动生成是自动的   创建变量引用时   取消引用未定义的值。在   换句话说,Perl autovivification   允许程序员引用a   结构化变量,任意   该结构的子元素   变量,没有明确声明   变量的存在及其存在   事先完成结构。

     

在   对比,其他编程语言   要么:1)要求程序员   明确声明一个完整的变量   使用或参考之前的结构   任何一部分;或2)要求a   程序员宣布一部分   参考之前的变量结构   任何一部分;或3)创建一个   赋值给变量的一部分   在引用,分配给或之前   构成一个引用的表达式   任何一部分。

     

Perl autovivication可以与Python,PHP,Ruby,JavaScript和所有C风格语言等语言形成对比。

可以使用no autovivification;

停用自动生存功能

答案 1 :(得分:11)

阅读Uri Guttman's article on autovivification

一旦你了解它并节省了许多尴尬,就没有什么奇怪的了。

  

Perl首先计算解除引用表达式,并看到当前引用值未定义。它记录了解除引用的类型(标量,数组或散列)并分配了该类型的匿名引用。然后Perl将新参考值存储在存储未定义值的位置。然后继续进行中的解除引用操作。如果你做一个嵌套的解引用表达式,那么从上到下的每个级别都可以导致它自己的自动生成。