我有一段代码,在子程序中我有一个哈希,我推动它对一个数组的引用。然后我返回那个数组:
sub subroutine1 {
my @arr;
my %hash = ("a", "b", "c", "d");
foreach $key (keys %hash) {
#I'm doing something
}
push @arr, \%hash;
return @arr;
}
但是后来当我使用子例程的返回值时,这个值是哈希引用,而不是包含一个哈希引用元素的数组。
所以上面的代码可以为我工作而不必费心将哈希引用放在数组中 - 我可能只是返回哈希引用。它对我有用,所以我选择较短的。
我的问题是,为什么perl这样做?这是预期的行为吗?
这是我调用子程序的地方:在另一个子程序中。我还使用统计模块进行所有解除引用。
sub subroutine2 {
my @other_arr;
for ($i = 0; $i < $val; $i++) {
push @other_arr, subroutine1($somedata);
}
foreach my $key (@keys) { # the keys of the hash are available from elsewhere
my $keystat = Statistics::Descriptive::Full->new();
for (my $i =0; $i < @other_arr; $i++) {
$keystat->add_data(${$other_arr[$i]}{$key});
}
}
# other stuff
}
答案 0 :(得分:4)
子例程永远不会返回perl中的数组,它们只返回(0或更多)标量列表。
如果在标量上下文中调用sub,则return @arr
将获取该上下文并返回@arr
中的元素数。如果您在列表上下文中调用它,@arr
的元素将作为列表返回。
如果您想要的是返回数组引用,请执行return \@arr
。