我正在读“Chan Bernard Ki Hong的Perl 5教程。他说......
小心枚举列表作为特例!如perlref联机帮助页上所示,获取枚举列表的引用将评估列表元素的引用列表。
我不确定“枚举列表”和“数组”之间的区别是什么。
他给出了数组的参考示例:
$arrayref = \@array;
列出一个列表:
@list = \($a, $b, $c); # Actually (\$a, \$b, \$c)
枚举列表($ a,$ b,$ c)对我来说就像一个数组。我在这里看不到什么?
因此,如果@array = ($a, $b, $c)
和$arrayref = \@array
,则不会@$array
为($a, $b, $c)?
答案 0 :(得分:2)
在perl中,数组是变量类型,从不是一种值。您可以将数组视为将列表存储为值的变量类型,但数组和列表则是非常不同的概念。 ($a,$b,$c)
是一个列表(假设它在列表上下文中;在标量上下文中,它是单个值$c
),而不是数组。
通常,你在变量上使用\(或者至少使用左值标量,如\ $ hash {key});您正在阅读的教程只是警告有关在列表值或切片上使用\的特殊情况:\($a,$b,$c)
等同于(\$a,\$b,\$c)
。另一方面,\@array
只是生成对数组的引用。
答案 1 :(得分:0)
我认为它是“列表是一个常量数组”:
@array = ("list item 1", "list item 2", "list item 3");
你做不了类似的事情:
("list item 1", "list item 2", "list item 3")[1] = "list item 2a";
因为您无法更改常量,但您可以这样做:
$array[1] = "list item 2a";
因为您将列表复制到上面的数组中,现在它是一个变量。
在你的例子中,是的,它们都是真正的数组:
#!/usr/bin/perl
use strict;
my $a = 1;
my $b = 2;
my $c = 3;
# copy a list into an array
my @array = ($a, $b, $c);
# create a reference to an arrayr
my $arrayref = \@array;
# copy a list of variable references into an array
my @list = \($a, $b, $c);
print "before:\n";
for (my $i=0; $i < 3; $i++) {
print "array[$i]: $array[$i]\n";
print "arrayref[$i]: $arrayref->[$i]\n";
print "list[$i]: ${$list[$i]}\n";
}
$array[1] = "2a";
$arrayref->[1] = "2a";
# ok, really a reference to a constant, which shouldn't be mixed in
# with references to variables, but for simplicity...
$list[1] = \"2a";
print "\nafter:\n";
for (my $i=0; $i < 3; $i++) {
print "array[$i]: $array[$i]\n";
print "arrayref[$i]: $arrayref->[$i]\n";
print "list[$i]: ${$list[$i]}\n";
}
exit 0;
输出:
before:
array[0]: 1
arrayref[0]: 1
list[0]: 1
array[1]: 2
arrayref[1]: 2
list[1]: 2
array[2]: 3
arrayref[2]: 3
list[2]: 3
after:
array[0]: 1
arrayref[0]: 1
list[0]: 1
array[1]: 2a
arrayref[1]: 2a
list[1]: 2a
array[2]: 3
arrayref[2]: 3
list[2]: 3
答案 2 :(得分:0)
我非常喜欢this blog post来解释数组和列表之间的差异。