Perl:枚举列表的引用

时间:2014-02-12 22:24:11

标签: perl

我正在读“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)?

3 个答案:

答案 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来解释数组和列表之间的差异。