Почему моя функция Perl max () всегда возвращает первый элемент массива? - PullRequest
5 голосов
/ 25 февраля 2010

Я относительно новичок в 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 ]

9 голосов
/ 25 февраля 2010

Заменить

my @array = shift;

с

my @array = @_;

@_ - массив, содержащий все аргументы функции. shift только захватывает первый аргумент функции и удаляет его из @_. Измените этот код, и он должен работать правильно!

2 голосов
/ 25 февраля 2010

Вы можете написать функцию как:

#!/usr/bin/perl

use strict; use warnings;

print max(@ARGV);

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

Однако было бы гораздо эффективнее передать ему ссылку на массив и еще эффективнее использовать List::Util::max.

2 голосов
/ 25 февраля 2010

Почему вы не хотите использовать то, что работает?

Одним из способов решения подобных проблем является отладка ваших структур данных. На каждом шаге вы печатаете данные, которые вы должны увидеть, действительно ли там есть то, что вы ожидаете. Это может быть так просто, как:

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

Или для сложных структур данных:

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

В этом случае вы бы видели, что @array имеет только один элемент, поэтому там должен быть максимум.

Если вы хотите увидеть, как работают списки и аргументы подпрограмм, посмотрите Learning Perl .

...