Почему ваш код не работает
В вашем коде довольно простая опечатка.
# V
if ($a[$i] == $b[$i]) {
$match = 1;
# V
push (@index, $j);
last;
}
Вы используете индекс $i
текущего элемента в @a
для доступа к одному и тому же значению в @b
каждый раз, а затем нажмите $j
, который вы никогда не использовали для сравнения.Вам нужно сравнить $a[$i]
с $b[$j]
.Это изменение одной буквы заставит программу работать.
if ($a[$i] == $b[$j]) {
$match = 1;
push (@index, $j);
last;
}
Лучший способ сделать это
Ваша реализация очень неэффективна.То, что вы хотите сделать, это искать вещи из @b
для @a
.Простой способ сделать это - создать хеш поиска (или index , как буквы на боковой панели телефонной книги).
use strict;
use warnings;
use 5.012; # for say and each on array
my @a = ( 3, 5, 8, 6, 7, 9 );
my @b = ( 5, 9, 3 );
my @index;
my $match;
my %index_of_a;
while ( my ( $index, $value ) = each @a ) {
$index_of_a{$value} = $index; # will overwrite
}
foreach my $value (@b) {
if ( exists $index_of_a{$value} ) {
say "The index of '$value' in \@a is '$index_of_a{$value}'";
}
}
Код перебирает значения@a
.Он использует массив в виде each
1 , который был добавлен в Perl 5.12.Затем он помещает их в хэш по значению, чтобы вы могли искать индекс, когда вы знаете значение.
Затем мы повторяем значения в @b
и проверяем, есть ли индекс для @a
внаш хеш для текущего значения.
Вывод выглядит следующим образом
The index of '5' in @a is '1'
The index of '9' in @a is '5'
The index of '3' in @a is '0'
Если значение существует в @a
более одного раза, будет использовано последнее вхождение.Мой код не отслеживает, какой индекс @b
соответствует когда.Я оставлю это вам.
1) хотя я обычно не люблю использовать each
, для массивов, где вы хотите получить и значение, и индекс, я нахожу это многоболее читабельный, чем цикл C-style for
.