【发布时间】:2016-02-05 15:37:05
【问题描述】:
我有一段代码,在子例程中我有一个哈希,我将它的引用推送到一个数组。然后我返回那个数组:
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
}
【问题讨论】:
-
你是如何调用子程序并使用返回的?也许添加一个例子。
-
你的调用代码是什么样的?这与引用无关,与列表有关。
-
因为我不耐烦,所以我会做一个猜测:-)。你正在做类似
my ($x) = subroutine();的事情。这是在列表上下文中调用subroutine,然后将返回列表的第一个元素分配给$x。返回列表的第一个(并且仅在这种情况下)元素是哈希引用,因此哈希引用被分配给 $x。所以你是对的,如果你返回的数组只有一个哈希引用,直接返回哈希引用。