Как я могу найти индексы, где два массива отличаются по значению? - PullRequest
2 голосов
/ 22 декабря 2011

Я хотел бы выяснить, какой элемент изменился между двумя массивами, в которых содержатся одинаковые данные.

@prev=("0","1","0","1");
@curr=("0","1","0","0");

Из приведенных выше двух массивов очевидно, что последний элемент массива изменился.

Как я узнаю, что изменился только конкретный элемент, и все остальные не должны были измениться, учитывая, что я знаю, какой индекс массива должен измениться?

Ответы [ 4 ]

2 голосов
/ 22 декабря 2011

Если вы не возражаете против того, чтобы я использовал свой собственный модуль, именно поэтому Array :: Compare было написано.

2 голосов
/ 22 декабря 2011

Чтобы узнать индексы, где значения изменились:

my @indices_of_change = grep { $prev[$_] ne $curr[$_] } 0 .. $#prev;

например. с:

my @prev = ( 0, 1, 0, 1 );
my @curr = ( 0, 1, 0, 0 );  # @indices_of_change == ( 3 );

Конечно, есть несколько оговорок:

  • Должны ли @curr и @prev иметь одинаковую длину? Каково ожидаемое поведение, если это не так?
  • Контекст DWIM нуждается в уточнении. Ожидаются ли строки внутри массива (ов)? '00' должно равняться '0'?
1 голос
/ 22 декабря 2011

Вы можете использовать функцию zip из List::MoreUtils, чтобы разрешить подобное сравнение. Использование zip имеет то преимущество, что оно работает с массивами, которые не имеют одинаковую длину.

use List::MoreUtils qw/zip/;
my @changed = 
    map { $_[0] != $_[1] }
        zip @prev, @curr;
0 голосов
/ 22 декабря 2011

Вы можете использовать Data :: Difference для сравнения массивов.И довольно легко изменить возвращаемый дифференциал в соответствии с вашими потребностями:

use strict;
use warnings;

use Data::Difference qw(data_diff);
use Data::Dumper;
my @prev = ( "0", "1", "0", "1" );
my @curr = ( "0", "1", "0", "0" );

my @diff = data_diff ( \@prev, \@curr );
my @indices_of_change = map { @{ $_->{ 'path' } } } @diff;
print Dumper ( \@indices_of_change );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...