2010-02-25 67 views
5

我对Perl比较新,我不想使用List::Utilmax函数来查找给定数组的最大值。为什么我的Perl max()函数总是返回数组的第一个元素?

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

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

现在你已经学会了如何实现max(),使用List :: Util的max()。它会更快,并且有更少的错误。 – Schwern 2010-02-25 01:44:39

+0

为什么你不想/不能使用List :: Util的'max'? – 2010-02-25 02:20:58

+4

只是一个提示:'else {$ cur = $ cur}'什么都不做,所以删除它。变量不会忘记它们的值,因为这次你没有通过循环来使用它们。) – hobbs 2010-02-25 03:10:07

回答

8

替换

my @array = shift; 

my @array = @_; 

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

+0

这可行,但你会介意解释吗?我以为你通过shift关键字传递参数..? – lotsofsloths 2010-02-25 01:17:14

+2

更新了我的帖子:)顺便说一句,你也应该'foreach我的$我'(或'为我的$我',这意味着同样的事情 - 和foreach是可以互换的)显式声明$ i变量以同样的方式你声明@array和$ cur。 – rjh 2010-02-25 01:18:50

+4

子程序参数在'@ _'数组中传递。 'shift'从指定的数组中移除第一个值并返回它 - 调用没有参数的'shift'使它作用于'@ _'数组。 – 2010-02-25 01:19:10

2

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

解决这类问题的方法之一就是调试你的数据结构。在每一步你打印数据你必须看看你的期望是否真的在那里。这可以是简单的:

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

或者复杂的数据结构:

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

在这种情况下,你会看到,@array只有一个元素,所以它必须是最大的。

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

+0

我假设他正在尝试练习Perl编程。我们有没有在某个时候编写我们自己的排序功能?:) – rjh 2010-02-25 01:28:18

+0

我尽量不要假设。这就是我问的原因。 :) – 2010-02-25 01:59:19

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

相关问题