Почему делает мой Perl макс. (), функционируют, всегда возвращают первый элемент массива?

Я относительно плохо знаком с Perl, и я не хочу использовать Список:: Util max функционируйте для нахождения максимального значения данного массива.

Когда я тестирую код ниже, он просто возвращает первое значение массива, не максимум.

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

5
задан brian d foy 25 February 2010 в 01:23
поделиться

3 ответа

Replace

my @array = shift;

with

my @array = @_;

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

9
ответ дан 18 December 2019 в 14:45
поделиться

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

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

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

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

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

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

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

2
ответ дан 18 December 2019 в 14:45
поделиться

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

#!/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
ответ дан 18 December 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: