我对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;
}
答案 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
会更有效。