关于引用的奇怪的perl行为

问题描述:

我有一段代码,在一个子例程中,我有一个散列,并且我将它推向一个数组。然后我返回数组:关于引用的奇怪的perl行为

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

你是如何调用子程序并使用返回的?也许增加一个例子。 – blm

+0

你的调用代码是什么样的?这与参考文献和与列表有关的一切无关。 –

+0

因为我很不耐烦,所以我会猜测:-)。你正在做'my($ x)= subroutine();'。这就是在列表上下文中调用'subroutine',然后将返回列表的第一个元素分配给$ x。返回列表的第一个(也是唯一的例子)元素是散列引用,所以散列引用被分配给$ x。所以你是对的,如果你的返回数组只有一个散列引用,直接返回散列引用。 – blm

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

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

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