我在Perl中有两个数据结构:
数组:
my @array2 = ( "1","2","3"); for $elem (@array2) { print $elem."\n"; }
给我以下输出:
1 2 3
和一个列表:
my @array = [ "1","3"]; for $elem (@array) { print $elem."\n"; }
给出以下输出:
ARRAY(0x9c90818)
显然,我想在这两种情况下迭代元素,但为什么第二个解决方案只给我这个数组的引用?
解决方法
Perl中的列表不是数据结构,它们是源代码中的位置,由围绕它们的上下文确定。列表基本上是Perl用来移动数据的瞬态结构。您使用Perl的所有语法与它们进行交互,但不能将它们用作数据类型。最接近列表的数据类型是数组。
my @var = (1,2,3); # parens needed for precedence,they do not create a list ^ an array ^ a list say 1,3; ^ a list say @var; ^ a list (of one array,which will expand into 3 values before `say` is called)
当你写[1,2,3]你正在做的是创建一个标量数组引用。该数组引用使用列表1,3初始化,它与创建命名的数组并引用它相同:
[1,3] ~~ do {my @x = (1,3); \@x}
由于[…]结构创建一个标量,你应该保持它在一个标量:
my $array = [1,3]; for my $elem (@$array) { # lexical loop variable print $elem."\n"; }
因为你想对整个数组进行操作,而不仅仅是引用,你在$数组前放置一个@,它取消引用存储的数组引用。