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