引用数组到数组产生大小而不是实际数组

时间:2017-09-26 00:55:15

标签: perl

可能是一个简单的答案,但这已经让我烦恼了很长一段时间。我有一个变量,它看起来是一个对象数组(哈希)的引用,即检索这个数组的子程序返回这个

return \@my_entities;

我看过的所有地方都说明了,为了遍历这些实体我需要做这样的事情

for my $obj (@{$ref}) {
   #do stuff
}

为什么如果我这样做:@ {$ ref},我得到SCALAR" 2"如果我有2个元素而不是数组?就像@ {$ ref}给我的大小而不是数组。

编辑:要详细说明,如果我这样做,那么在我的上下文中操作符会相反。

scalar $ref  

我得到了阵列。如果我做的话

@($ref)

我得到了长度。是否有一些隐藏的选项可以反转行为?

我最近才开始使用perl,代码库相当庞大,所以不可能将它全部粘贴在这里,但故障点的要点看起来与下面的答案非常相似。基本上,sub返回对数组/列表的引用,并且正在尝试循环该列表。

如果我这样做

sub f { 
   my @my_entities = @_;
   return \@my_entities;
}

my $ref = f(qw( a b c d ));
for my $obj (@{$ref}) {
   print $obj;
}

结果是4,它没有循环遍历元素。如果我将@ {$ ref}更改为标量$ ref,我会列出一个b c d。

应该说我正在使用Camelcade调试器在我的笔记本电脑上通过Webstorm在Linux服务器上运行它。

2 个答案:

答案 0 :(得分:6)

如果您在标量上下文中评估@{$ref},您将获得$ref引用的数组中的元素数(就像您在标量上下文中评估过@a一样)。 / p>

如果您在列表上下文中评估@{$ref},您将获得$ref引用的数组的元素(就像您在列表上下文中评估了@a一样)。

在您发布的代码中,您正在执行后者。

use strict;
use warnings;
use feature qw( say );

sub f { 
   my @my_entities = @_;
   return \@my_entities;
}

my $ref = f(qw( a b c d ));
for my $obj (@{$ref}) {
   say $obj;
}

输出:

a
b
c
d

答案 1 :(得分:0)

数组引用和实际数组之间没有区别。如果在列表上下文中计算数组,则会获得数组元素。如果在标量上下文中计算数组,则获得数组中的元素数。

my @array = qw[A B C];
print "@array"; # list context gives 'A B C'
print scalar @array; # scalar context gives 3

my $array_ref = \@array;
print "@$array_ref"; # list context gives 'A B C'
print scalar @$array_ref; # scalar context gives 3