如何找到两个数组值不同的索引?

时间:2011-12-22 09:14:20

标签: perl

我想知道哪个元素在两个包含相同数据的数组之间发生了变化。

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

从上面两个数组中可以清楚地看到数组的最后一个元素发生了变化。

我怎么知道只有一个特定的元素发生了变化,所有这些元素都不应该改变,因为我知道该数组的哪个索引应该改变?

4 个答案:

答案 0 :(得分:2)

找出值已更改的索引:

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

e.g。用:

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

当然,有几点需要注意:

  • @curr@prev应该是相同的长度吗?如果不是,那么预期的行为是什么?
  • 需要澄清DWIM的背景。字符串是否应该在数组中? '00'是否应该等于'0'

答案 1 :(得分:2)

如果你不介意我拉扯我自己的模块,这正是写Array::Compare的原因。

#!/usr/bin/perl

use strict;
use warnings;

use 5.010;
use Array::Compare;

my @prev = qw(0 1 0 1);
my @curr = qw(0 1 0 0);

my $cmp = Array::Compare->new;

my @diffs = $cmp->full_compare(\@prev, \@curr);

say "Difference at these indexes: @diffs";

答案 2 :(得分:1)

您可以使用List::MoreUtils中的zip功能进行比较。使用zip的优点是它适用于长度不相等的数组。

use List::MoreUtils qw/zip/;
my @changed = 
    map { $_[0] != $_[1] }
        zip @prev, @curr;

答案 3 :(得分:0)

您可以使用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 );