平均值函数在空数组上返回随机数

noa*_*oah 1 perl

我正在使用 perl 5.16。

我有以下函数可以给出任何给定数组内的平均值:

sub GetAvgValue {
    my @Array = @_;

    my $Sum = 0;
    foreach my $CurVal (@Array) {
        $Sum += $CurVal;
    }

    if ( scalar(@Array) ) {
        return $Sum / scalar(@Array);
    }
    else {
        return undef;
    }
}
Run Code Online (Sandbox Code Playgroud)

undef我希望它在数组内没有元素时返回,但它返回一个看起来随机的整数:

print Dumper GetAvgValue([]);
# 1. iteration: $VAR1 = '42311136';
# 2. iteration: $VAR1 = '38006240';
# 3. iteration: $VAR1 = '39394784';
Run Code Online (Sandbox Code Playgroud)

TLP*_*TLP 7

[]是一个数组引用。您没有在代码中使用数组引用。因此,这个子调用是错误的:

GetAvgValue([]);
Run Code Online (Sandbox Code Playgroud)

参数列表@_现在不为空,它包含一个值:一个数组引用。你应该做的是:

GetAvgValue();
Run Code Online (Sandbox Code Playgroud)

发送一个空列表。因为您在子例程内分配数组,如下所示:

my @Array = @_;
Run Code Online (Sandbox Code Playgroud)

如果您使用像[]这样的数组引用,您将这样做:

my $aref = shift;         # or
my $aref = $_[0];         # or
my ($aref, @rest) = @_;   # etc

my @Array = @$aref;       # dereference 
Run Code Online (Sandbox Code Playgroud)

末尾的“随机查找值”是数组引用的数字地址,除以 1。演示:

$ perl -lwe'print []'
ARRAY(0x79a7d0)

$ perl -lwe'print []/1'
15443920
Run Code Online (Sandbox Code Playgroud)