比较深层嵌套的数据结构,忽略数组顺序

时间:2017-02-28 07:28:44

标签: arrays perl compare

我需要使用perl比较深层嵌套的数据结构。 结构可以包含标量,数组和散列。 我更喜欢XS实现。 数据最初以JSON的形式到达。

在数据模式中,数组内的项目顺序无法保证,因此难以比较。

我试过Test :: Deep。当唯一的数组位于顶层时,方法很容易,但当顺序不敏感的数组嵌套在结构的更深处时,方法很重。

1 个答案:

答案 0 :(得分:2)

如果数组只能包含标量。您可以尝试使用Data::Compare。这是一个数值数组的例子。您需要为Data::compare编写插件,有关详细信息,请参阅Data::Compare::Plugins

<强> test.pl

use lib '.';
use strict;
use warnings;
use Data::Compare;

my $h1 = { a => {b => [2, 1, 3] }, c => 3};
my $h2 = { a => {b => [1, 2, 3] }, c => 3};

print 'The structures $h1 and $h2 are ',
  Compare($h1, $h2) ? "" : "not ", "identical.\n";

<强> ./数据/比较/插件/ ArrayBag.pm

package Data::Compare::Plugins::ArrayBag;

use strict;
use warnings;
use Data::Compare;

sub _register {
    return [
        ['ARRAY', 'ARRAY', \&array_compare],
    ];
}

sub array_compare {
    my($a1, $a2) = @_;

    return 0 if (scalar @$a1) != (scalar @$a2);
    my @ar1 = sort { $a <=> $b } @$a1;
    my @ar2 = sort { $a <=> $b } @$a2;
    for my $i (0..$#ar1 ) {
        return 0 if $ar1[$i] != $ar2[$i];
    }
    return 1;
}

_register();

输出来自test.pl

The structures $h1 and $h2 are identical.