刚开始使用Perl,我在这个代码示例中使用了错误的括号:
@arr = {"a", "b", "c"};
print "$_\n" foreach @arr;
我的意思是,我当然可以看到它在运行时会发生什么,但我不明白为什么会这样做。不应该因为语法错误而失败吗?
答案 0 :(得分:3)
您不小心创建了匿名哈希,这是一个没有标识符且只能通过引用访问的哈希。
数组@arr
设置为单个元素,该元素是对该哈希的引用。正确编写它看起来像这样
use strict;
use warnings;
my @arr = (
{
a => "b",
c => undef,
}
);
print "$_\n" foreach @arr;
这就是你得到输出
的原因HASH(0x3fd36c)
(或类似的东西),因为Perl将把哈希引用表示为字符串。
如果你想进行实验,那么你可以使用$arr[0]
作为哈希引用打印第一个哈希元素的值(数组在索引为零的只有一个元素)并访问元素的值密钥a
与print $arr[0]->{a}, "\n"
。
请注意,因为哈希必须具有两个值的多个(一组键/值对),所以通过在末尾添加undef
,您自己代码中的哈希会隐式扩展为四个值。 / p>
至关重要,您将use strict
和use 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
一个散列引用的列表与任何其他列表一样合法,所以不,它不应该是语法错误。