我想知道哪个元素在两个包含相同数据的数组之间发生了变化。
@prev=("0","1","0","1");
@curr=("0","1","0","0");
从上面两个数组中可以清楚地看到数组的最后一个元素发生了变化。
我怎么知道只有一个特定的元素发生了变化,所有这些元素都不应该改变,因为我知道该数组的哪个索引应该改变?
答案 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
应该是相同的长度吗?如果不是,那么预期的行为是什么?'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 );