为什么我的Perl max()函数总是返回数组的第一个元素?

时间:2010-02-25 01:11:49

标签: perl arrays foreach max

我对Perl相对较新,我不想使用List::Util max函数来查找给定数组的最大值。

当我测试下面的代码时,它只返回数组的第一个值,而不是最大值。

sub max
{
    my @array = shift;
    my $cur = $array[0];
    foreach $i (@array)
    {
        if($i > $cur)
        {
            $cur = $i;
        }
        else
        {
            $cur = $cur;
        }
    }
    return $cur;
   }

3 个答案:

答案 0 :(得分:9)

替换

my @array = shift;

my @array = @_;

@_是包含所有函数参数的数组。 shift只抓取第一个函数参数并将其从@_中删除。更改该代码,它应该正常工作!

答案 1 :(得分:2)

为什么不想使用有效的东西?

解决此类问题的方法之一是调试数据结构。在每个步骤中,您都可以打印数据,以查看您所期望的实际数据。这可以很简单:

 print "array is [@array]\n";

或者对于复杂的数据结构:

 use Data::Dumper;
 print Dumper( \@array );

在这种情况下,您会看到@array只有一个元素,因此它必须是最大值。

如果您想查看列表分配和子例程参数的工作方式,请查看Learning Perl

答案 2 :(得分:2)

您可以将函数编写为:

#!/usr/bin/perl

use strict; use warnings;

print max(@ARGV);

sub max {
    my $max = shift;
    $max >= $_ or $max = $_ for @_;
    return $max;
}

但是,将它传递给数组会更有效率,使用List::Util::max会更有效。