Perl数组初始化不正确

时间:2014-08-06 13:52:19

标签: arrays perl

刚开始使用Perl,我在这个代码示例中使用了错误的括号:

@arr = {"a", "b", "c"};
print "$_\n" foreach @arr;

我的意思是,我当然可以看到它在运行时会发生什么,但我不明白为什么会这样做。不应该因为语法错误而失败吗?

3 个答案:

答案 0 :(得分:3)

您不小心创建了匿名哈希,这是一个没有标识符且只能通过引用访问的哈希。

数组@arr设置为单个元素,该元素是对该哈希的引用。正确编写它看起来像这样

use strict;
use warnings;

my @arr = (
  {
    a => "b",
    c => undef,
  }
);

print "$_\n" foreach @arr;

这就是你得到输出

的原因
HASH(0x3fd36c)

(或类似的东西),因为Perl将把哈希引用表示为字符串。

如果你想进行实验,那么你可以使用$arr[0]作为哈希引用打印第一个哈希元素的值(数组在索引为零的只有一个元素)并访问元素的值密钥aprint $arr[0]->{a}, "\n"

请注意,因为哈希必须具有两个值的多个(一组键/值对),所以通过在末尾添加undef,您自己代码中的哈希会隐式扩展为四个值。 / p>

至关重要,您将use strictuse warnings添加到您编写的每个Perl程序的顶部。在这种情况下,后者会提出警告

Odd number of elements in anonymous hash

答案 1 :(得分:3)

令人惊讶的是,Perl中的语法错误很少。在这种情况下,您偶然发现了创建匿名哈希引用的语法:{ LIST }。在初始化数组 1 时,Perl不需要使用括号(()类型)。数组包含标量(单个)值的有序列表,引用是标量,因此perl愉快地使用该引用初始化数组作为唯一元素。

它不是你想要的,但它是完全有效的Perl。

<子> ()覆盖运算符的优先级,从而更改表达式的行为。 @a = (1, 2, 3)执行您期望的操作,但@a = 1, 2, 3表示(@a = 1), 2, 3,因此它只会将1分配给@a

答案 2 :(得分:2)

{ LIST }是哈希构造函数。它创建一个哈希,为其分配LIST的结果,并返回对它的引用。

my $h = {"a", "b", "c", "d"};
say $h->{a};  # b

一个散列引用的列表与任何其他列表一样合法,所以不,它不应该是语法错误。