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

为什么在Perl中,undef值成为有效的数组引用?,perl,Perl,在perl 5.8.5中,如果执行以下操作,则不会出现错误: use strict; my $a = undef; foreach my $el (@$a) { ...whatever } 这是怎么回事?打印出ref($a)的输出将显示$a在某个点更改为有效的数组引用。但我从未明确地将$a设置为任何值 似乎有点奇怪,变量的内容可以在我不做任何事情的情况下更改 有什么想法吗 编辑:是的,我知道所有关于自动生命化的事情。我一直认为在触发它的过程中,必须有一个任务,而不仅仅是一个引用。就是这个

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

use strict;

my $a = undef;
foreach my $el (@$a) {
  ...whatever
}
这是怎么回事?打印出
ref($a)
的输出将显示
$a
在某个点更改为有效的数组引用。但我从未明确地将
$a
设置为任何值

似乎有点奇怪,变量的内容可以在我不做任何事情的情况下更改

有什么想法吗

编辑:是的,我知道所有关于自动生命化的事情。我一直认为在触发它的过程中,必须有一个任务,而不仅仅是一个引用。

就是这个词。从链接:

自动激活是Perl编程的一个显著特征 涉及动态的语言 创建数据结构。 自生是自动的 在以下情况下创建变量引用: 未定义的值被取消引用。在里面 换言之,Perl的自我激活 允许程序员引用 结构化变量和任意变量 该结构的子元素 变量,而不明确声明 变量的存在性及其性质 提前完成结构

在 相比之下,其他编程语言 或者:1)要求程序员 明确声明整个变量 使用或引用前的结构 它的任何部分;或2)要求 程序员声明一个程序的一部分 参考前的可变结构 它的任何部分;或者3)创建一个 赋值给变量的一部分 在提及、指派给或 组成引用的表达式 它的任何部分

Perl Autovivation可以与Python、PHP、Ruby、JavaScript和所有C风格的语言进行对比

可以通过读取禁用自动激活

一旦你了解了它并避免了很多尴尬,它就没有什么奇怪的了

Perl首先对解引用表达式求值,并发现当前引用值未定义。它记录取消引用的类型(标量、数组或哈希),并分配该类型的匿名引用。然后,Perl将新的引用值存储在存储未定义值的位置。然后继续进行取消引用操作。如果执行嵌套的取消引用表达式,则自上而下的每个级别都会导致其自身的自动激活


这是perl。Oddity很好,因为它很奇怪。我不认为这很奇怪,只是为了方便保存一些声明。@Stefano:为什么只对troll检查Perl问题?这很乏味……Telemachus:Python程序员认为每种情况下都只有一种真正的方法。@Alexandr:是的,我知道“应该有一种——最好只有一种——显而易见的方法”的哲学思想。但处理有关Perl
troll(post)的问题的唯一真正方法是什么呢
?我一直刷新此页面以查看答案,因为我很好奇。哇,Perl真的很奇怪:)这是Perl的DWIM优点(照我说的做)。。。。除非它在你不喜欢的时候咬了你。仅供参考,你可以禁用autoviv,谢谢,Daodoad。我已经把这一点写进了答案本身。接下来的问题。为什么它不能自动激活:
my$a;my@x=@$a
?@FM:一般来说,仅从解引用读取的内容不会自动激活,而可能修改解引用内容的内容会自动激活。for循环就是一个可以修改的示例(因为$el被别名化到数组中,并且可以通过它更改数组)。不过,这只是一个松散的规则;有一些粗糙的边缘。小心带有下标的情况,即使只是从中读取,也可能会发生自生