在perl 5.8.5中,如果我执行以下操作,则不会出现错误:
use strict;
my $a = undef;
foreach my $el (@$a) {
...whatever
}
这里发生了什么?打印出ref($a)
的输出表明$a
更改为在某个时刻成为有效的数组引用。但我从未明确地将$a
设置为任何内容。
如果没有我做任何事情,变量的内容可能会改变,这似乎有些奇怪。
思考,有人吗?
编辑:是的,我知道所有关于自动生存的知识。我一直认为必须在某个地方有一个任务来触发它,而不仅仅是一个参考。答案 0 :(得分:15)
Auto-vivification就是这个词。从链接:
停用自动生存功能自动生成是Perl编程的一个显着特征 涉及动态的语言 创建数据结构。 自动生成是自动的 创建变量引用时 取消引用未定义的值。在 换句话说,Perl autovivification 允许程序员引用a 结构化变量,任意 该结构的子元素 变量,没有明确声明 变量的存在及其存在 事先完成结构。
在 对比,其他编程语言 要么:1)要求程序员 明确声明一个完整的变量 使用或参考之前的结构 任何一部分;或2)要求a 程序员宣布一部分 参考之前的变量结构 任何一部分;或3)创建一个 赋值给变量的一部分 在引用,分配给或之前 构成一个引用的表达式 任何一部分。
Perl autovivication可以与Python,PHP,Ruby,JavaScript和所有C风格语言等语言形成对比。
答案 1 :(得分:11)
阅读Uri Guttman's article on autovivification。
一旦你了解它并节省了许多尴尬,就没有什么奇怪的了。
Perl首先计算解除引用表达式,并看到当前引用值未定义。它记录了解除引用的类型(标量,数组或散列)并分配了该类型的匿名引用。然后Perl将新参考值存储在存储未定义值的位置。然后继续进行中的解除引用操作。如果你做一个嵌套的解引用表达式,那么从上到下的每个级别都可以导致它自己的自动生成。