可能是一个简单的答案,但这已经让我烦恼了很长一段时间。我有一个变量,它看起来是一个对象数组(哈希)的引用,即检索这个数组的子程序返回这个
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服务器上运行它。
答案 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