关于引用的奇怪的perl行为

时间:2015-11-04 23:06:03

标签: perl reference

我有一段代码,在子程序中我有一个哈希,我推动它对一个数组的引用。然后我返回那个数组:

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
}

1 个答案:

答案 0 :(得分:4)

子例程永远不会返回perl中的数组,它们只返回(0或更多)标量列表。

如果在标量上下文中调用sub,则return @arr将获取该上下文并返回@arr中的元素数。如果您在列表上下文中调用它,@arr的元素将作为列表返回。

如果您想要的是返回数组引用,请执行return \@arr