关于引用的奇怪的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
}
答
子程序永远不会在perl中返回数组,它们只返回(0或更多)标量列表。
如果您在标量上下文中调用sub,则您的return @arr
将获取该上下文并返回@arr
中的元素数。如果您在列表上下文中调用它,@arr
的元素将作为列表返回。
如果您想要返回数组引用,请执行return \@arr
。
你是如何调用子程序并使用返回的?也许增加一个例子。 – blm
你的调用代码是什么样的?这与参考文献和与列表有关的一切无关。 –
因为我很不耐烦,所以我会猜测:-)。你正在做'my($ x)= subroutine();'。这就是在列表上下文中调用'subroutine',然后将返回列表的第一个元素分配给$ x。返回列表的第一个(也是唯一的例子)元素是散列引用,所以散列引用被分配给$ x。所以你是对的,如果你的返回数组只有一个散列引用,直接返回散列引用。 – blm