【问题标题】:Why does an undef value become a valid array reference in Perl?为什么 undef 值会成为 Perl 中的有效数组引用?
【发布时间】:2010-12-11 06:02:45
【问题描述】:

在 perl 5.8.5 中,如果我执行以下操作,我不会收到错误:

use strict;

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

这里发生了什么?打印出ref($a) 的输出表明$a 在某些时候变为有效的数组引用。但我从来没有明确地将$a 设置为任何东西。

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

有什么想法吗?

编辑:是的,我知道所有关于自动复活的知识。我一直认为在触发它的过程中必须有一个分配,而不仅仅是一个参考。

【问题讨论】:

  • 这是 perl。奇怪很好,因为它很奇怪。
  • 我觉得并不奇怪,只是为了方便保存一些声明。
  • @Stefano:为什么要检查 Perl 问题只是为了拖钓?这很乏味...
  • Telemachus:Python 程序员认为每种情况总是只有一种正确的方法。
  • @Alexandr:是的,我知道“应该有一种——最好只有一种——显而易见的方法”这一理念。但是处理有关 Perl troll(post) 的问题的唯一正确方法是什么?

标签: perl


【解决方案1】:

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

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

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

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

可以使用no autovivification;禁用自动激活

【讨论】:

  • 我一直在刷新此页面以查看答案,因为我很好奇。哇,Perl 真的很奇怪 :)
  • 这是 Perl 的 DWIM 优点(按我的意思去做)。
  • ...除非你不喜欢它时它会咬你。
  • 仅供参考,您可以使用 search.cpan.org/perldoc/autovivification 禁用 autoviv
  • 谢谢,daotoad。我已将其放入答案本身。
【解决方案2】:

阅读Uri Guttman's article on autovivification

知道了就没有什么奇怪的了,省了很多尴尬。

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

【讨论】:

  • 后续问题。为什么不自动激活:my $a; my @x = @$a
  • @FM:通常,仅从取消引用中读取的内容不会自动激活,而可能会修改取消引用的内容会。 for 循环是一个可以修改的例子(因为 $el 是数组的别名,并且可以通过它更改数组)。不过,这只是一个松散的规则;有一些粗糙的边缘。
  • 小心带有下标的情况,即使只是读取它们,也可能会发生自动恢复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2010-10-25
  • 2017-07-14
  • 2010-11-19
  • 1970-01-01
  • 2015-12-02
  • 2017-09-17
相关资源
最近更新 更多