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

agg*_*ton 0 perl

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

return \@my_entities;
Run Code Online (Sandbox Code Playgroud)

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

for my $obj (@{$ref}) {
   #do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:详细说明,如果我这样做,操作员似乎在我的背景下工作

scalar $ref  
Run Code Online (Sandbox Code Playgroud)

我得到阵列.如果我这样做

@($ref)
Run Code Online (Sandbox Code Playgroud)

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

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

如果我这样做

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

my $ref = f(qw( a b c d ));
for my $obj (@{$ref}) {
   print $obj;
}
Run Code Online (Sandbox Code Playgroud)

结果我得到4,它不会循环遍历元素.如果我将@ {$ ref}更改为标量$ ref,我会列出abcd.

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

ike*_*ami 6

如果@{$ref}在标量上下文中进行评估,则将获得引用的数组中的元素数$ref(就像@a在标量上下文中进行了评估一样).

如果您@{$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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

a
b
c
d
Run Code Online (Sandbox Code Playgroud)