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

为什么我的Perl max()函数总是返回数组的第一个元素?,perl,arrays,foreach,max,Perl,Arrays,Foreach,Max,我对Perl比较陌生,我不想使用max函数来查找给定数组的最大值 当我测试下面的代码时,它只返回数组的第一个值,而不是最大值 sub max { my @array = shift; my $cur = $array[0]; foreach $i (@array) { if($i > $cur) { $cur = $i; } else {

我对Perl比较陌生,我不想使用
max
函数来查找给定数组的最大值

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

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

my @array = shift;


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

你为什么不想用一些有用的东西呢

解决此类问题的方法之一是调试数据结构。在每一步中,你都要打印数据,看看你所期望的是否真的在那里。这可以简单到:

 print "array is [@array]\n";
或对于复杂的数据结构:

 use Data::Dumper;
 print Dumper( \@array );
在本例中,您会看到
@array
只有一个元素,因此它必须是最大值

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

如果要查看列表赋值和子例程参数的工作方式,请查看。

您可以将函数编写为:

#!/usr/bin/perl

use strict; use warnings;

print max(@ARGV);

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

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

会更有效,但是您介意解释一下吗?我以为你是通过shift关键字传递参数的。更新了我的帖子:)顺便说一句,你也应该使用“foreach my$I”(或“for my$I”,这意味着相同的事情-for和foreach是可互换的)来显式声明$I变量,方法与声明@array和$cur相同。子例程参数在
@
数组中传递
shift
从指定的数组中删除第一个值并返回它-不带参数调用
shift
会导致它作用于
@
数组。lotsofsloths:所以“声明”参数的两种常用方法是:
my($an_arg,$anu arg)=@
my$an_arg=shift;我的$Other_arg=班次在子对象内,不带参数的shift从@(参数)移动到子对象。在任何子类之外,它都从@ARGV(脚本的参数)转移。我们不是都在某个时候编写了自己的排序函数吗?:)我尽量不去假设。这就是我问的原因。:)现在您已经了解了如何实现max(),请使用List::Util的max()。它会更快,bug也会更少。您不想/不能使用List::Util的
max
的任何特定原因?只是一个提示:
否则{$cur=$cur}
什么都不做,所以请删除它。变量不会因为这次没有通过循环使用而忘记它们的值:)