问题描述
在 perl 5.8.5 中,如果我执行以下操作,则不会出现错误:
In perl 5.8.5, if I do the following, I don't get an error:
use strict;
my $a = undef;
foreach my $el (@$a) {
...whatever
}
这是怎么回事?打印出 ref($a)
的输出表明 $a
在某个时候变成了一个有效的数组引用.但我从来没有明确地将 $a
设置为任何东西.
What's going on here? Printing out the output of ref($a)
shows that $a
changes to become a valid array reference at some point. But I never explicitly set $a
to anything.
一个变量的内容可以在我不做任何事情的情况下改变,这似乎有点奇怪.
Seems kind of odd that the contents of a variable could change without me doing anything.
有想法吗?
是的,我了解自动激活.我一直认为在触发它的过程中必须有一个任务,而不仅仅是一个参考.
Yes, I know all about auto-vivification. I always thought that there had to be a assignment somewhere along the way to trigger it, not just a reference.
推荐答案
一旦你了解它,就没有什么奇怪的了,省去了很多尴尬.
There is nothing odd about it once you know about it and saves a lot of awkwardness.
Perl 首先计算一个解引用表达式并发现当前引用值是未定义的.它记录解引用的类型(标量、数组或散列)并分配该类型的匿名引用.Perl 然后在存储未定义值的地方存储新的引用值.然后继续进行中的解引用操作.如果你做嵌套的解引用表达式,那么从上到下的每一层都会导致它自己的autovivication.
这篇关于为什么 undef 值会成为 Perl 中的有效数组引用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!