我正在开发一个子程序,它取平均值为1个或多个数组。我想在不使用模块的情况下这样做。
use strict;
use warnings;
use List::Util 'sum';
my @w = (0, 2);
my @x = (1, 3);
my @y = (2, 2);
my @z = (1, 1);
# the average of these four arrays is (1,2) since
# (0+1+2+1)/4 = 1 and (2+3+2+1)/4 = 2
my @arrays = \(@w, @x, @y, @z);
my @avg;
# this is the way to do it using the module
for my $i (0..$#w) {
$avg[$i] = sum(map $_->[$i], @arrays) / @arrays;
}
print "@avg\n";
# my way of doing it without module
@avg;
for my $i (0..$#w) {
$avg[$i] = prod_sum(map $_->[$i], \@arrays) / @arrays;
}
print "@avg\n";
# subroutines
sub prod_sum{
my $o = $_[0];
my $arr_ref = $_[1];
my $array_ref;
foreach my $row (@$arr_ref){
foreach my $cell (@$row) {
push(@{ $array_ref }, $_);
}
}
my $sum = $o + the_sum($array_ref);
return $sum;
}
sub the_sum{
my $sum = 0;
for ( @{$_[0]} ) {
$sum += $_;
}
return $sum;
}
输出
1 2
[pair of really random big numbers]
第一个输出是正确的。它显示所有阵列的平均值。第二个输出是完全错误的。如何在不使用模块的情况下执行此操作?
答案 0 :(得分:1)
你认为sum正在传递两个变量,它不是。它只是传递一个数组。修改你的prod_sum只期望一个数组(并且在prod_sum的调用中将\@arrays
替换为@arrays
)。或者您可以使用它:
sub sum {
return 0 if $#_ < 0;
my $head = shift;
return $head + sum(@_);
}
以上是一个递归子程序,它将对数组求和。
注意:如果您的数组有超过100个元素,use warnings
将发出深度递归警告。有关该主题的更多信息,请参阅here
答案 1 :(得分:1)
我建议这个解决方案:
use strict;
use warnings;
my @w = (0, 2);
my @x = (1, 3);
my @y = (2, 2);
my @z = (1, 1);
my @arrays = \(@w, @x, @y, @z);
my ($x, $y) = (0, 0);
foreach my $arr(@arrays) {
$x += $arr->[0];
$y += $arr->[1];
}
my @result = ( $x / @arrays, $y / @arrays);
print "(@result)", "\n"; # <---- prints (1 2)