#arrays #perl
#массивы #perl
Вопрос:
Привет, я новичок в Perl и нахожусь в процессе обучения. У меня есть массив
@array = ( 10, 40, 59, 40, 90, 100, 30, 40, 100, 20, );
Я хочу найти максимальное число в массиве, а также хочу знать индекс, в котором присутствует максимальное число в моем массиве.
Я делаю
my $maxValue = max @array;
print $maxValue; # displays the maximum number in the entire array
my ($index) = grep $array[$_] eq $maxValue , 0.. $#array;
print ($index); # this gives me the index of the maximum number which was found in the array.
Результат, который я получаю, равен 100 с индексом 5
Но на самом деле 100 появляется в массиве 2 раза: один раз с индексом 6 и снова с индексом 8. Мой код предоставляет мне только первый найденный индекс с максимальным значением.
Как я могу получить весь индекс, который имеет максимальное значение с ними?
Комментарии:
1. Присвоите результат grep массиву вместо скалярного параметра
Ответ №1:
my @index = grep $array[$_] eq $maxValue , 0.. $#array;
print @index;
Кажется, это самый простой способ.
Хотя для чисел вам действительно следует использовать ==
, даже если, например, 100 также является допустимой строкой.
Комментарии:
1. Немного больше о
==
иeq
.100 == 100.0E0
верно и100 eq 100.0E0
также верно. Но"100" == "100.0E0"
верно, но не"100" eq "100.0E0"
Ответ №2:
Это один раз через массив для определения максимального значения и всех индексов:
use warnings;
use strict;
use Data::Dumper;
my @array = ( 10, 40, 59, 40, 90, 100, 30, 40, 100, 20, );
my %uniq;
my $i = 0;
my $max = 0;
for (@array) {
push @{ $uniq{$_} }, $i;
$i ;
$max = $_ if $_ > $max;
}
print "max=$max at indexes:n";
print Dumper($uniq{$max});
__END__
max=100 at indexes:
$VAR1 = [
5,
8
];
Другой способ … без хэша:
use warnings;
use strict;
use Data::Dumper;
my @array = ( 10, 40, 59, 40, 90, 100, 30, 40, 100, 20, );
my @maxs;
my $i = 0;
my $max = 0;
for (@array) {
if ($_ > $max) {
@maxs = $i;
$max = $_ ;
}
elsif ($_ == $max) {
push @maxs, $i;
}
$i ;
}
print "max=$max at indexes:n";
print Dumper(@maxs);
Комментарии:
1. Однако для списка отрицательных чисел это не сработает. Вместо этого используйте число из массива.